JavaScript 连等赋值

最近探究js原理的过程中遇到了这个挺有趣的问题。


先贴代码:

var a = {n:1}

a.x = a = {n:2}

alert(a.x) //undefined


在弄懂这个之前,我们先普及一个知识点,就是在javascript运算符中,属性运算符的优先级高于赋值运算符的优先级。


因此,a.x是先于赋值之前就进行的。


就是说,a.x刚开始是undefined的,这是没错的。


接下来我们探究一下连等赋值的赋值顺序:


1、从左往右

a.x赋值为{n:2};然后a赋值为{n:2};a的重新指向重写了a.x,即.x属性不存在,因此a.x输出为undefined。


2、从右往左

a赋值为{n:2};直接限制了a.x的赋值,因为.x在a赋值之前就已经创建了,因此不可能在为a.x赋值。


上述两种猜想都是大部分人的猜想,我一开始认为是从左往右,最后看了一大波的大神解释,我总结出我自己的结论,如有不对,请指出。


如果简单的看赋值,或许都争论不出来,但是如果从引用的角度去思考,也许不同。


我的猜想是这样的,在连等赋值的过程中,若有同一个引用变量进行操作,那么在不同阶段,两者可能会分开为不同指针,或者说是不同变量,因为指向的对象不同。


因此我觉得是从右往左,过程如下:


在连等赋值过程中,重写不会发生,因此每个变量指向的对象都不会改变,也就是指针不会改变。

真诚赞赏,手留余香
赞赏
随机推荐
Node.js i18n 国际化实现语言切换
jQuery.position()不可靠
ThinkPHP RESTful API 最佳实践1
跟Github学习设计不符合 CRUD 情况的RESTful API
Node.js process.env 根据环境切换配置文件
PHP 获取父分类和子分类常用递归函数
PS笔记
Wordpress 学习笔记 4 数据库操作
Koa.js 中间件 koa-session
20170829临摹手绘