minjs1cn / weekly-learning

每周学习分享打卡
0 stars 0 forks source link

57 经典面试题 #57

Open Brand0n-Zhang opened 2 years ago

Brand0n-Zhang commented 2 years ago
题目1:
if(false){
    var a = 1;
    let b = 2;
}
console.log(a);
console.log(b);

题目2:
var a = 1;
if(true){
    console.log(a);
    let a = 2;
}

题目3:
var a = {n: 1}
var b = a
a.x = a = {n: 2}
console.log(a.n, b.n);
console.log(a.x, b.x);
tradyau commented 2 years ago

1.

// 输出
undefined

ReferenceError: b is not defined

var不会产生块级作用域,let会产生块级作用域。

伪代码相当于:

var a;
if(false){
    a = 1;
    let b = 2;
}
console.log(a); 
console.log(b);

2.

// 输出

ReferenceError: Cannot access 'a' before initialization

let声明的变量不会提升,并且会产生暂存死区。在let声明变量之前访问变量会抛出错误。

3.

// 输出

2 1

undefined {n: 2}

var b = a,此时a和b指向同一个对象。

.运算符比 = 运算符高,先计算`a.x`,此时 
b = {
    n:1,
    x:undefined
}

相当于给对象添加了x属性。

a.x = a = {n:2};

计算完a.x,再计算 = ,赋值是从右向左,此时a指向一个新对象。
a = {
    n:2
}

a.x已经执行过了,此时对象的x属性赋值为a,此时

对象 = {
    n:1,
    x:{
        n:2
    }
}

即:
a = {
    n:2
}

b = {
    n:1,
    x:{
        n:2
    }
}