对于 a.x=a={n:1} 这种面试题,个人理解主要考察js两点知识:js中的引用类型和赋值表达式的运算顺序。
完整的题目是这样的:
var a = {n: 1};
var b = a;
a.x = a = {n: 2};
请输出
a.x //undefined
b.x //{n:2})
个人理解:
1、赋值运算顺序:
由于js中“.”操作符的优先级要高于赋值,所以在执行a.x = a = {n: 2}的时候,首先确定a.x是谁,再给a.x赋值,然后运算a={n:2},最终为再为a.x赋值;
2、引用关系:
a和b指向同一块内存地址,也就是对{n: 1}的引用,即a===b;
表象是a.x,其实是{n:1}的属性x,由于运算顺序的原因,首先确定a.x其实是{n:1}的属性x,也为b的属性x。a和b还保持着对{n:1}的引用。当运行道a={n:2}的时候,由于a重新的重新赋值,a不在引用{n:1};最后给a.x赋值的时候,其实是为{n:1}的属性x赋值,此时b还对{n:1}保持引用,所以最终输出的时候:
a.x即{n:2}属性x的就等于undefined;
b.x即{n:1}的x就等于a({n:2});
描述不到之处,请指正;
——end——