前端进阶|第十二天 连续赋值到底赋给了谁?

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

输出结果为
console.log(a.x);//undefined
console.log(b);//Object {n: 1 x: {n: 2}}

看的我有点懵,不是刚给a.x赋值了么,怎么转眼就undefined了呢?

看到网友结构过程是这样的。
1.给a赋值,a作为一个对象指向{n:1}.

var a = {n: 1};

2.b和a共同指向{n:1}

var b = a;

3.关键在第三行的拆解

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

等价于

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

传统编程语言认为a.x的结果就是括号运算的结果,但js却偏不。
首先计算a.x,因为之前我们并没有给a声明成员x,所以a.x运算的结果就是,给a和b执行的{n:1}声明一个成员,即{n:1,x:undefined},因为还没赋值,所以值是 undefined.
接着计算a={n:2},这个操作,会使得a开始指向{n:2},而不再是{n:1,x:undefined}。也就是说a移情别恋了,现在指向{n:1,x:undefined}只剩下了b。
那么最终对{n:1,x:undefined}里面的x赋值,只对b有效。所以最终打印a.x针对的是{n:2}这个对象,当然是undefined。而b里面的x赋值顺利完成为{n:2},即b最终值为{n:1,x:{n:2}}.
js果然自成一派。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,421评论 0 2
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 13,932评论 0 38
  • 第一章 前端三大语言:HTML(专门编写网页内容)、CSS(编写网页样式)、JS(专门编写网页交互行为) 能简写尽...
    fastwe阅读 1,043评论 0 0
  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些阅读 2,060评论 0 2
  • 01javascript语法规范 <!DOCTYPE html> javascript语法...
    ouyangqinbin阅读 1,335评论 0 0