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赋值。


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


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


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


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


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

声明:本站所有文章和图片,如无特殊说明,均为原创发布。商业转载请联系作者获得授权,非商业转载请注明出处。
随机推荐
Vue3 挂载全局方法
JavaScript 窗口/文档事件
JavaScript console 的用法
JavaScript BOM 浏览器对象模型
Node.js 控制台进度条实现原理
Express 使用 cors 模块支持跨域
WordPress 后台添加菜单
WordPress 侧边栏小工具