likes
comments
collection
share

面试必修课:解锁编程基础题的通关秘籍

作者站长头像
站长
· 阅读数 34

第一道题

let a = Symbol(1);
let b = Symbol(1);

console.log(a === b);

面试必修课:解锁编程基础题的通关秘籍

分析:

上面的结果为false是因为symbol创建的变量是唯一的、不可变的值,所以不存在两个一样的symbol类型的数据,可以看出Symbol在JavaScript中主要用于创建独特的属性键,以支持更高级别的封装和避免属性名冲突,尤其在大型项目和库的开发中非常有用,例如:key可以用symbol类型,因为key要是唯一的。

第二道题

const a = [];
a = [1];
console.log(a);

面试必修课:解锁编程基础题的通关秘籍

分析:

上面报错的原因是const 关键字定义的变量,一旦赋值后,其值不能被改变。

第三道题

const b = [];
b.push(2);
console.log(b);

面试必修课:解锁编程基础题的通关秘籍

分析:

上面的数组能够改变是因为在JavaScript中,使用const定义的数组是不可以重新赋值的,但是你可以修改数组内部的元素,包括使用pushpopsplice等方法来改变数组的内容,这是因为const关键字保证的是变量引用的不可变性,而不是数组或对象内容的不可变性。

第四道题

分析一下下面的输出结果:

function test(person) {
person.age = 30;
person = {
    name: 'lpp',
    age: 40
}
return person;
}

const p1 = {
    name: 'ltt',
    age: 18
}
const p2 = test(p1);

console.log(p1);
console.log(p2);

面试必修课:解锁编程基础题的通关秘籍

面试必修课:解锁编程基础题的通关秘籍

分析:

通过上面的图可以大致的了解上面代码的执行上下文,栈里有两个执行上下文test函数执行上下文和全局执行上下文:

  • 全局执行上下文:
  1. 变量环境:test = func
  2. 词法环境:p1 = #001(#001为对象p1的引用地址,因为p1的数据类型为引用数据类型,引用数据类型的值存放在堆中)
  • test函数执行上下文:
  1. 变量环境:person = #001
  2. 词法环境:

test函数先是将p1的age改成了30,后面的person对象为一个新的对象,返回的person为该新对象,也就是p2为这个person,所以p1的结果为{name:'ltt',age:30},p2的结果为{name:'lpp',age:40}

第五道题

function foo(x, y) {
    x = {
        n: 1
    };
    y.n = 2;
}

const obj = {
    n: 1,
    bar: {
        n: 1
    }
}

foo(obj, obj.bar);

console.log(obj);

面试必修课:解锁编程基础题的通关秘籍

面试必修课:解锁编程基础题的通关秘籍

分析:

上面给出了代码的执行上下文,在该栈中有两个执行上下文:foo函数执行上下文和全局执行上下文:

  • 全局执行上下文:
  1. 变量环境:foo = func
  2. 词法环境:obj = #001(obj为引用数据类型,值存放在堆中)
  • foo函数执行上下文:
  1. 变量环境:x = #001, y = #002
  2. 词法环境:

调用foo函数,传入的xobj,也就是将引用地址给x,即x = #001yobj.bar,也就是将bar的引用地址给y,即y = #002x = {n:1}是新形成了一个对象#003,和obj无关,y.n = 2;就是修改barn的值,所以得到上面的结果。

知识点总结

类型

  1. 原始类型

string number boolean null undefined symbol bigInt

  • 浮点数,js在计算浮点数的时候会存在精度丢失,js会将浮点数转化为二进制进行相加
  1. 引用类型

类型判断

  1. typeof --- 可以判断除了null之外的所有原始类型
  2. instanceof --- 只能判断引用类型(因为它是根据原型链来判断的)
  3. object.prototype.toString.call(obj)

toString()

js中每一种类型都有自己的toString方法,可以分为3类

  1. 对象上的toString():返回一个'[object xxxx]'结构的字符串
  2. 数组上的toString():返回数组类元素用逗号分隔的字符串
  3. 其他:返回字符串字面量

对象上的toString()

toString(x),v8会读取到x的内部属性[[class]],这个属性记录的就是x所属的构造函数, toString()最终会返回 由"[object " + [[class]] + "]"组成的字符串

转载自:https://juejin.cn/post/7384266820465934388
评论
请登录