函数this指向+运算符优先级+复合数据类型引用

// 1
var a = 10;
var obj = {
  a: 100,
  pro: {
    getPro: () => {
      console.log(this.a)
    }
  }
}
obj.pro.getPro(); 

// 2
var a = {n: 1};
var b = a;
a.x = a = {n: 2};
console.log(a.x);
console.log(b.x);

第一题:

箭头函数不会创建自己的this,它只会从自己的作用域链的上一层继承this。因此此时getPro的this指向window,因此this.a=10;

第二题:

这里首先要理解一个概念:基本数据类型和复合数据类型、栈和堆。
简单来说,基本数据类型,诸如数字、字符串是存储在栈中的,声明的变量直接引用数据本身。
而诸如对象、数组等复合数据类型是存储在堆中的,声明的变量是引用的堆中数据的地址。因此假设我声明一个变量a={n:1};再声明b=a; 此时我除非直接给a重新赋值,否则只更改a对象内容的话b也会跟着改变。因为他们引用的是同一个数据的引用地址。而如果重新赋值,则他们引用的就不是同一个地址了。

第二题重点的运算是这一行:

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

赋值表达式运算顺序从右向左,而.运算符的优先级要高于=运算符,因此先运算a.x,在{n:1}对象中创建一个x:undefind,此时a=b={n:1,x:undefind},然后从右向左运算给a对象重新赋值为{n:2},因为直接重新赋值,所有b对象还是{n:1,x:undefind}不受影响。然后a.x={n:2},因为最先运算的a.x还是指向原来的对象{n:1,x:undefind}的x,最终结果b={n:1,x:{n:2}},a={n:2}

打印结果:

image.png

你可能感兴趣的:(函数this指向+运算符优先级+复合数据类型引用)