谁能帮我解释一下这段 JavaScript 代码
PHPz
PHPz 2017-04-10 16:43:37
[JavaScript讨论组]
var a = {n:1};
var b = a;

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

console.log(a.x);
console.log(b.x);

结果我是知道了,但不知道为什么。

PHPz
PHPz

学习是最好的投资!

全部回复(5)
迷茫

新手也来答一下,

我对指针也不怎么了解,说的不对的地方勿喷啊。
首先说明一点问题:“属性访问表达式优先级高于运算符”
即a.x=1; 先运行a.x
//代码从上往下运行
var a = {n:1};
//a指向   {n:1} (通俗点说我们叫m空间吧)
var b = a;
//b指向a所指向的内容 即b指向{n:1} (m空间)
a.x = a = {n:2};
//1 a.x
//前面说了 属性访问表达式优先级高于运算符  先运行a.x
//这个时候的a还是指向{n:1} (m空间) 那么"m空间会创建一个x属性" 即m空间m.x 即{n:1,x:undefiend}
//2 a={n:2}
//然后执行a={n:2} 这个时候a的指向改变 a指向{n:2} (代号n空间) 这个时候的a 与上一步骤时候的a的指向已经不同了
//3 a.x(m空间)=a(n空间);
//这个时候m的x属性指向n空间  
//代码执行完毕 来查看答案m空间( {n:1,x:{n:2}} ) ,  n空间( {n:2} )
//变量指针指向  a指向n空间  b指向m空间


// 以上 输出结果可想而知
PHPz

属性访问表达式优先级高于“=”号,优先执行a.x={n:2},再执行a={n:2},a的指向变了,此时a中并没有x属性了,而b的指向不便,原来的对象{n:1}被添加了x属性

ringa_lee

----原先以为是这样的----
首先,a 与 b 变量引用同一对象,然后,新对象{n: 2} 重写变量 a, 创建并赋值给 a 的成员 x,此时 a 与 b 引用的不是同一对象了。
所以,a.x 输出新对象。 b.x 输出 undefined。
----现在----
再想了一遍,或许是这样的,首先,ab 引用同一对象,然后 a.x = a = {n: 2} ,这里应该是先在 a 与 b 创建 x ,b.x 和 a.x 都指向 a ,a.x = a 把自己给重写了。于是 a.x 输出 undefined ,b.x 输出 {n: 2}。

PHP中文网

由ES规范学JavaScript(二):深入理解“连等赋值”问题

高洛峰

该问题已经有啦
请移步
http://segmentfault.com/q/1010000002637728

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号