前几天看到一个javascript 连续赋值的问题,运行了一下,结果出乎意料,发现这里的水真的有点深啊,连续赋值的底层机制,没有一本前端书籍有详细介绍的,自己做实验研究了一下,先来看结果:

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

运行结果:

a.x: undefined

b.x: Object {n: 2}

a.x居然是undefined,没搞错吧,根据我印象中的连续赋值原理,执行顺序是从右向左执行,a.x = a = {n: 2} ,相当于依次执行了(1) a={n:2}, (2) a.x=a 这两行代码,那么a.x应该是递归引用到a本身的,形成一棵子节点无限引用自身的子树,但是我猜中了开头却没猜中结局,我的世界观开始崩塌,先来验证一下连续赋值是否是从右向左的吧。

var a={};
Object.defineProperty(a,"x",{
get:function(){console.log("get a.x");return this._x;},
set:function(v){console.log("set a.x:"+v);this._x=v;return this._x}
})

var b={};
Object.defineProperty(b,"x",{
get:function(){console.log("get b.x");return this._x;},
set:function(v){console.log("set b.x:"+v);this._x=v;return this._x}
})

a.x=b.x="hello,world";

运行结果是

set b.x:hello,world
set a.x:hello,world

说明了两件事:

1)赋值顺序是从右向左

2)执行了b.x="hello,world",a.x="hello,world",   a.x的值并没有从b.x获取,因为get属性存取器并没有执行。

那么问题来了,a.x = a = {n: 2} ,等价的运行结果是a={n:2}, a.x={n:2}   ,a.x应该有值才对,现在运行的结果是b有值,说明这两行代码虽然是有先后执行顺序,但实际上是相互隔离的。当执行a.x={n:2} 时,a的引用仍然指向旧的对象(即变量b指向的对象),所以b.x有值了。

最新文章

  1. XtraBackup出现 Can't connect to local MySQL server through socket '/tmp/mysql.sock'
  2. 使用antd UI组件有感
  3. javascript之-深入事件机制
  4. 【bzoj2818】 Gcd
  5. [Effective JavaScript 笔记]第46条:使用数组而不要使用字典来存储有序集合
  6. ACM - ICPC World Finals 2013 A Self-Assembly
  7. mysql show processlist 显示mysql查询进程
  8. <一> ASP.NET Html 表单
  9. [Forward]Visual Guide: Setting up My Sites in SharePoint 2013
  10. 2016/01/10 C++ Primer 小记 —— 命令行编译环境配置
  11. Octave Tutorial(《Machine Learning》)之第五课《控制语句和方程及向量化》
  12. Cohort Analysis and LifeCycle Grids mixed segmentation with R(转)
  13. python中__name__
  14. 硬盘扩容9999T
  15. 在 ubuntu 中安装 python3.5、 tornado、 pymysql
  16. Mysql模糊查询Like传递参数的语句
  17. idataway_前端代码规范
  18. 20165315 实验一 Java开发环境的熟悉
  19. Python中sys和os模块的区别
  20. 用windows浏览器打开Linux的Jupyter notebook开发、调试示例

热门文章

  1. 神奇的URL Schemes大全
  2. Java并发编程之并发简介
  3. PyCharm配置TensorFlow开发环境
  4. win7 & win10 安装AD管理工具
  5. 【HITB GSEC CTF 2017】1000levels
  6. Linux-lsxxx
  7. java基础知识(1)
  8. JSONPath 表达式的使用
  9. 024、MySQL字符串替换函数,文本替换函数
  10. postman带上token对接口进行测试