写了10年Javascript未必全了解的连续赋值运算

 

一、引子

var a = {n:1};  
a.x = a = {n:2};  
alert(a.x); // --> undefined  

这是蔡蔡在看jQuery源码 时发现这种写法的。 以上第二句 a.x = a = {n:2} 是一个连续赋值表达式。 这个连续赋值表达式在引擎内部究竟发生了什么?是如何解释的?

二、猜想

猜想1:从左到右赋值,a.x 先赋值为 {n:2},但随后 a 赋值为 {n:2}, 即 a 被重写了,值为 {n:2},新的 a 没有 x属性,因此为undefined。

步骤如下

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

这种解释得出的结果与实际运行结果一致,貌似是对的。

注意猜想1中 a.x 被赋值过。

猜想2:从右到左赋值,a 先赋值为{n:2},a.x 发现 a 被重写后(之前a是{a:1}), a.x = {n:2} 引擎限制a.x赋值,忽略了。

步骤如下:

a = {n:2};
a.x 未被赋值{n:2}

等价于 a.x = (a = {n:2}),即执行了第一步,这样也能解释a.x为undefined了。

注意猜想2中a.x压根没被赋值过。

三、证明

上面两种猜想相信多数人都有,群里讨论呆呆认为是猜想1, 我认为是猜想2。其实都错了。 我忽略了引用的关系。

如下,加一个变量b,指向a。

var a = {n:1};  
var b = a; // 持有a,以回查  
a.x = a = {n:2};  
alert(a.x);// --> undefined  
alert(b.x);// --> [object Object]  

发现a.x仍然是undefined,神奇的是 b.x 并未被赋值过(比如:b.x={n:2}),却变成了 [object Object]。 b 是指向 a({n:1}) 的,只有 a.x = {n:2} 执行了才说明b是有x属性的。 实际执行过程:从右到左,a 先被赋值为 {n:2},随后a.x被赋值 {n:2}。

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

等价于

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

与猜想2的区别在于a.x 被赋值了,猜想2中并未赋值。 最重要的区别,第一步 a = {n:2} 的 a 指向的是新的对象{n:2}, 第二步 a.x = {n:2} 中的 a 是 {a:1}。

即在这个连等语句

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

a.x 中的a指向的是 {n:1},a 指向的是 {n:2}。

              a.x  =  a  = {n:2}
              │      │
    {n:1}<──┘      └─>{n:2}

四:解惑

这篇写完,或许部分人看完还是晕晕的。 因为里面的文字描述实在是绕口。

最初我在理解这个连等赋值语句时

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

认为引擎会限制a.x的重写(a被重写后),实际却不是这样的。 指向的对象已经不同了。引擎也没有限制a.x={n:2}的重写。

五:结束

呵,以另一个连续赋值题结束。 fun执行后,这里的 变量 b 溢出到fun外成为了全局变量。

想到了吗?

function fun(){  
    var a = b = 5;  
}  
fun();  
alert(typeof a); // --> undefined  
alert(typeof b); // --> number  

 

文章来源:http://justjavac.com/javascript/2012/04/05/javascript-continuous-assignment-operator.html

前端必知必会-JavaScript 赋值运算符 本文介绍了JavaScript 赋值运算符的使用,如有问题欢迎私信和评论。 阅读详情

相关推荐

PID控制参数整定(调节方法)原理+图示+MATLAB调试

序 首先最重要的是了解每个参数调节了系统响应的那些属性,通过观察响应从而调节参数改变属性。 PID的作用概述: 1、P产生响应速度和力度,过小响应慢,过大会产生振荡,是I和D的基础。 2、I在有系统误差和外力作用时消除偏差、提高精度,同时也会增加响应速度,产生过冲,过大会产生振荡。 3、D抑制过冲和振荡,过小系统会过冲,过大会减慢响应速度。D的另外一个作用是抵抗外界的突发干扰,阻止系统的突变。 同时调节的顺序是:P>I>D 下面了解的一个很重要的就是调节的目标,也就是最好的响应曲线.

viafcccy的博客 16万+

java 连续运算_JS连续运算

JavaScript是函数式编程语言,表达式运算的能力比较强大,通过连续运算可以设计敏捷的程序代码。示例1最常用的是连续赋值运算。var a = b = c = 1;上面代码相当于声明 3个变量,并全部初始化值为 1。示例2条件运算符在连续运算中扮演者重要的角色,它可以把复杂的分支结构浓缩到一个表达式中。例如,在事件处理函数中,经常会用下面表达式处理事件对象兼容问题。event ? event...

weixin_39741101的博客 317

微信小程序音视频通话(for硬件)授权与设备注册实战指南

本文详细介绍了微信小程序音视频通话(for硬件)组件的开发实践,涵盖授权流程、设备注册与VoIP插件集成。重点解析了如何通过服务端获取snTicket实现用户授权,确保硬件设备与微信端的音视频通话安全可靠,适用于智能门禁、话机等物联网场景。

u6v7w8x的博客 945

javascript连续求值

<input type="text" id="a" /> <input type="text" id="b" /> <input type="text" id="c" /> <script type="text/javascript"> Function.prototype.$continuous = function(fn)...

weixin_30306905的博客 105

PyCharm与MicroPython联手:打造高效ESP32开发环境

本文详细介绍了如何使用PyCharm与MicroPython打造高效的ESP32开发环境。通过配置PyCharm插件、刷写MicroPython固件以及实战示例,帮助开发者快速上手嵌入式Python开发,显著提升物联网项目的开发效率。

weixin_29169899的博客 380

dxf-viewer 查看器

dxf-viewer SDK 的示例,它是一个基于 Three.js 和 Vue3 构建的基于 WebGL 的 BIM 模型查看器。它用于查看 DWG/DXF/PDF 文件。面积测量 - 角度测量 -标记。

qq_25547755的博客 866

jQuery 取值、赋值的基本方法

/*获得TEXT.AREATEXT的值*/ var textval = $("#text_id").attr("value"); //或者 var textval = $("#text_id").val(); /*获取单选按钮的值*/ var valradio = $("input[@type=radio][@checked]").val(); ...

tianshan57的博客 2099

用matlab编程求矩阵的极大无关组,向量组极大无关组表示问题

已知向量组T:Eqn11.gif (3.16 KB, 下载次数: 1)2013-10-21 19:19 上传.(1) 求向量组T的秩,并判断向量组T的相关性;(2) 求T的极大线性无关组;(3) 将其余的向量用所求的极大线性无关组线性表示。程序:>> A=[1 1 3 2;-1 1 -1 3;5-2 8 9;-1 3 1 7]>> r=rank(A)>> A1=...

weixin_35094083的博客 7387

转载:写了10年Javascript未必全了解的连续赋值运算 --> 说明了JS中变量是引用

写了10年Javascript未必全了解的连续赋值运算 摘自: http://www.iteye.com/topic/785445 很喜欢蔡蔡 的这个标题,实际蔡蔡已经分析过了,这里借用了。或许有点标题党的意思。看完就知了。   一、引子 Js代码   var a = {n:1};   a.x = a = {n:2};   alert(a.x

shenyan008的专栏 1226

别再魔改LWIP了!用STM32CubeMX配置F407的TCP保活(KeepAlive)与自动重连

本文详细介绍了如何通过STM32CubeMX配置STM32F407的LWIP协议栈,实现TCP保活(KeepAlive)与自动重连功能,解决网络异常断开问题。文章提供了从基础环境配置到自动重连架构设计的完整指南,帮助开发者构建高可靠的网络连接机制,适用于工业物联网和嵌入式设备开发。

weixin_27038245的博客 234

webapi .net core8.0配置使用Token权限认证

本人在网上找了很多版本,不是太复杂就是不行。

m0_74824592的博客 1760

写了 10 年 Javascript 未必全了解的连续赋值运算

一、引子 var a = {n:1}; a.x = a = {n:2}; alert(a.x); // --> undefined 看 jQuery 源码 时发现的这种写法。 以上第二句 a.x = a = {n:2} 是一个连续赋值表达式。 这个连续赋值表达式在引擎内部究竟发生了什么?是如何解释的? 二、猜想 猜想1:从左到右赋值,a.x 先赋值为 {n:2},但随后 a

我的Github 1474

从 VS Code 创建 ABAP Development Objects,包、命名、传输请求和 Clean Core 的一条线打通

文章摘要: SAP ABAP开发工具正从传统SAP GUI/Eclipse向VS Code迁移,通过ABAP Development Tools扩展实现代码编辑、调试和传输管理。文章重点分析了创建ABAP对象背后的治理逻辑:1)对象创建涉及包结构、命名规范、传输层等关键设计决策;2)VS Code通过命令面板(Ctrl+Shift+P)提供统一创建入口;3)对象类型选择反映架构意图,应从业务模型角度规划;4)Package是重要的治理边界,需按业务能力分区;5)命名和描述需体现业务语义;6)传输请求标记对象

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 176

js中的连续赋值

最近在准备换工作的事情,面试中遇到js连续赋值的问题,在这里做个总结。 下面是面试题目 // 面试题 var a = { n: 1 }; var b = a; a.x = a = { n: 2 }; console.log(a); console.log(b); console.log(a.x); console.log(b.x); 首先来看下js中基本类型的连续赋值是下面这样: v...

盖盖 3781

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

值得深思的连续赋值--赋值运算符运算顺序

最近在看到以前前辈留下的文章,对于连续赋值(var a={n:1}; a.x=a={n:2}))这个知识点,一开始也搞不清楚,但是最终还是说服了自己,谈谈自己的心得。以下代码能回答正确的可以忽略本文。 1 var a={n:1}; 2 var b=a; 3 a.x = a = {n: 2}; 4 console.log(a.x); //? 5 console.log(b...

agzmcmr0333的博客 1605

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

上一篇: 什么是Node.js
下一篇: 关于html5的7个传说
SleepInDelphi
博客等级 码龄19年 32粉丝 388原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值