奇葩面试题记录

1.    var  a = {n:100};

  var b=a;         为什么要有这步, 因为后面对a的赋值操作会丢失a对{ n:100 } 的引用

       a.x = a = { n:200 };   这是核心考点

  console.log( a.x );    

  console.log( b.x );

  解析: 

  1). js的赋值运算顺序永远都是从右往左的,但是 a.x = a = { n:200 }中,  由于"."是优先级高于"="赋值运算符,所以这行代码先执行了a.x, 即 为变量a引用的{n:100}对象中添加x属性, 并初始化为undefined, 此时初始化完成, 就等待赋值了  此时 a 引用的对象变成了  { n:100, x: undefined }。

  2). 这时才开始赋值操作, a = { n:200 } 再 a.x = { n:200 },  这时不会因为a.x 中的a的引用变了, a.x再去重新初始化, 而是接着赋值给原先的a.x,即 { n:100, x:{ n:200 }}

       总结:  最重要考点:  就是连等赋值   和   变量.属性优先级,   还有  代码在运行前已经编译完毕,  后续会按先前编译的初始化环境赋值

2.. 

猜你喜欢

转载自www.cnblogs.com/andy-lehhaxm/p/10743605.html