先看代码:
var a = {n: 1};var b = a;a.x = a = {n: 2};console.log(a.x);//undefinedconsole.log(b);输出结果为
console.log(a.x);//undefined
console.log(b);// {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却偏不。
1)首先计算a.x,因为之前我们并没有给a声明成员x,所以a.x运算的结果就是,给a和b指向的{n:1}声明一个成员,即{n:1,x:undefined}(因为还没赋值,所以值是undefined.)
2)接着计算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}}.
继续阅读与本文标签相同的文章
下一篇 :
编程小技巧之 Linux 文本处理命令
-
6 个 K8s 日志系统建设中的典型问题,你遇到过几个?
2026-05-18栏目: 教程
-
阿里云容器服务ACK集群上如何使用ack-etcd-backup-operator定期自动对ETCD集群数据做备份
2026-05-18栏目: 教程
-
开发函数计算的正确姿势——借助 Ghostscript 将 PDF 转换成 JPG
2026-05-18栏目: 教程
-
阿里云RDS如何进行账号及数据库管理?
2026-05-18栏目: 教程
-
Jenkins on ACK实战(三):容器化的构建
2026-05-18栏目: 教程
