面试题——关于运算符及优先级的思考

时间:2022-02-14 17:20:56

题目如下:

    var a={n:1};
var b=a;
a.x
=a={n:2};

console.log(a.x);
console.log(b.x);

这道题考查了两个知识点:1:内存空间 2:运算符的优先级

关于运算符知识点:

 

题目解析:

首先变量a指向对象{n:1},变量b也指向对象{n:1},都指向同一个对象

面试题——关于运算符及优先级的思考

接下来由于a.x中的.的优先级高于=

所以第一步执行a.x,此时a指向的对象添加了一个x属性,变成了{n:1,x:undefined},此时b依然指向这个对象

面试题——关于运算符及优先级的思考

 

接下来继续分析a.x=a={n:2};

赋值的结合性是从右到左,所以以上式子等价于a.x=(a={n:2});

先执行a={n:2},此时堆内存重新开辟一块空间存放对象{n:2},a就指向了新的内存空间,而b指向原来的内存空间

面试题——关于运算符及优先级的思考

 

右侧的=执行完以后继续执行左边的赋值运算

a(旧).x=a( 新)={n:2},因为a( 新)={n:2}返回a(新)本身,所以a(旧).x=a(新)

 

面试题——关于运算符及优先级的思考

 

因此:

面试题——关于运算符及优先级的思考

var a={n:1};
var b=a;
a.x
=a={n:2};

console.log(a.x); //undefined
console.log(b.x); //{n:2}