面试题——关于运算符及优先级的思考
题目如下:
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}
真正的稳定,不是你在一家单位有饭吃,而是你足够牛逼,不论走到哪里都有饭吃