`
jiangzhenwei6
  • 浏览: 34525 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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

 
阅读更多
该文章中将分享一下作者在写Javascript的心得,是关于连续赋值运算一些技巧。对大家在Web开发方面肯定有很大的启发和帮助。

一、引子
   1. var a = {n:1};     
   2. a.x = a = {n:2};     
   3. alert(a.x); // --> undefined    

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

  二、猜想

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

这种解释得出的结果与实际运行结果一致,貌似是对的。注意猜想1中 a.x 被赋值过。

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

等价于 a.x = (a = {n:2}),即执行了第一步,这样也能解释a.x为undefined了。注意猜想2中a.x压根没被赋值过。

  三、证明

上面两种猜想相信多数人都有,群里讨论呆呆认为是猜想1, 我认为是猜想2。其实都错了。我忽略了引用的关系。如下,加一个变量b,指向a。
   1. var a = {n:1};     
   2. var b = a; // 持有a,以回查     
   3. a.x = a = {n:2};     
   4. alert(a.x);// --> undefined     
   5. 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}。
   1. a = {n:2};  
   2. a.x = {n:2};  

//等价于

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

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

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

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

Javascript的连续赋值运算

  四:解惑

这篇写完,或许部分人看完还是晕晕的。因为里面的文字描述实在是绕口。最初我在理解这个连等赋值语句时
Js代码

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

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

谢谢所有参与讨论的人:蔡蔡、猪大肠 、呆呆、雅儒。这个问题最早是蔡蔡提出的。雅儒在 菜鸟灰呀灰 群里每次的讨论都那么投入,认真,哪怕是别人提出的话题。

五:结束

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

   1. function fun(){     
   2.     var a = b = 5;     
   3. }     
   4. fun();     
   5. alert(typeof a); // --> undefined     
   6. alert(typeof b); // --> number   

原文链接 :http://www.javaeye.com/topic/785445
http://developer.51cto.com/art/201101/242997.htm
分享到:
评论

相关推荐

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

    以上第二句 a.x = a = {n:2} 是一个连续赋值表达式。这个连续赋值表达式在引擎内部究竟发生了什么?是如何解释的? 二、猜想 猜想1:从左到右赋值,a.x 先赋值为{n:2},但随后 a 赋值为 {n:2},即 a 被重写了,值为 ...

    javascript实现连续赋值

    这说明了JavaScript中的赋值运算的右结合性如何影响连续赋值。在编写连续赋值代码时,开发者需要考虑到这一点,以避免因理解错误而导致的bug。 此外,当涉及到对象和属性的赋值时,还应特别注意JavaScript中对象...

    JavaScript实现检验除法运算

    在JavaScript编程语言中,实现除法运算检验是一个重要的任务,特别是在进行数学计算或者验证用户输入时。这个过程涉及到了对浮点数处理、错误处理、以及条件判断等多个方面。下面我们将详细探讨如何在JavaScript中...

    javascript连续赋值问题

    标题中提到的知识点是“JavaScript连续赋值问题”,这涉及到JavaScript编程语言中一个特殊的语法现象,即在一行代码内,对多个变量或对象属性进行赋值操作时可能出现的顺序和行为问题。在了解这个问题之前,我们需要...

    使用HTML5、CSS3和JavaScript实现简易四则运算

    在本项目中,我们将探讨如何使用HTML5、CSS3和JavaScript技术来创建一个简单的四则运算计算器。这个计算器能够执行基本的加法、减法、乘法和除法操作,对于初学者来说是一个很好的实践项目,它能帮助理解前端开发的...

    javascript input自动赋值

    在"javascript input赋值"这个压缩包文件中,可能包含了一些示例代码或者教程,用于演示如何在实际项目中应用这些技术。通过学习和理解这些示例,开发者能够更好地掌握JavaScript中对input元素的操作,提高前端开发...

    js 连续赋值的简单实现

    在JavaScript中,连续赋值是一种常见的操作,它允许开发者将一个值赋给多个变量。通常情况下,连续赋值不会引起混淆,但是当涉及对象和引用时,就可能出现一些不易察觉的陷阱。了解这些陷阱和连续赋值的内部机制对于...

    计算器运算逻辑实现(带括号,求余,乘方,加减乘除),不使用eval函数-前端JavaScript 源码实现-括号匹配与初等运算

    加法(+)、减法(-)、乘法(*)和除法(/)是基础,但为了支持括号和更复杂的运算,我们需要了解优先级和运算顺序。在JavaScript中,括号用于改变运算顺序,表达式`a * (b + c)`会先计算括号内的`b + c`,然后将...

    JavaScript中的连续赋值问题实例分析

    JavaScript中的连续赋值问题涉及到语言的基本语法和运算符优先级,是编程时常见的陷阱之一。在JavaScript中,赋值操作符“=”具有较低的优先级,并且是从右向左结合的,这意味着它会先处理右侧的表达式,然后将结果...

    JavaScript实现算术运算算子演示系统

    此外,JavaScript还支持复合赋值运算符,如`+=`, `-=`等,它们可以简化代码并进行连续运算: ```javascript a += b; // 等价于 a = a + b a -= b; // 等价于 a = a - b ``` 在HTML5中,我们可以利用`<canvas>`元素...

    JavaScript 浮点 运算 函数

    此函数是我自己写的,虽然在网上可以搜到很多,不过我找到的都是在算法中存在基本的浮点数的运算,导致结果仍然是错误的。由于刚刚学写JS,所以可能考虑不够周全,望大家批评指正。 代码中加了四舍五入函数,是网上...

    javascript经典特效---对数运算.rar

    例如,求以10为底的对数`log10(x)`,可以写成`Math.log(x) / Math.log(10)`。 2. **Math.pow()**: - 指数运算:`Math.pow(base, exponent)` 返回`base`的`exponent`次幂。这个方法不仅用于对数运算的逆运算,还...

    Javascript做的计算器源代码

    JavaScript是一种广泛应用于网页和网络应用开发的脚本语言,它主要负责处理客户端的交互逻辑,为用户提供...通过这个项目,你可以深入了解浏览器环境下的JavaScript运行机制,以及如何利用JavaScript提高网页的互动性。

    JAVASCRIPT 写一个函数 , 用户输入任意两个数字的任意算数运算 (简单的计算器小功能) , 并能弹出运算后的结果

    var num1 = prompt('请输入第一个数:'); var re = prompt('请输入你要进行的运算符:'); var num2 = prompt('请输入第二个数:'); function getSum(num1,re,num2,) { switch (re) { case '+': ...

    javascript给span标签赋值的方法.docx

    ### JavaScript给span标签赋值的方法 在Web开发中,JavaScript是一种非常重要的客户端脚本语言,它可以帮助我们实现页面上的动态效果、数据处理等功能。本文主要介绍如何使用JavaScript为`<span>`标签赋值,我们将...

    JAVASCRIPT通过移位操作实现四则运算

    JavaScript是一种广泛应用于Web开发的脚本语言,它在处理四则运算时提供了多种方式,包括基本的算术运算符和位运算符。本篇将详细探讨如何利用位移操作实现四则运算,以及这些方法在实际编程中的应用。 在...

    JavaScript内核系列 pdf

    JavaScript语法基于ECMAScript规范,包括变量声明(var、let、const)、数据类型(如字符串、数字、布尔值、对象、数组等)、运算符(算术、比较、逻辑、位运算等)、流程控制(条件语句、循环结构)以及函数等。...

    javascript给span标签赋值的方法

    关于JavaScript给span标签赋值的方法,我们可以通过原生JavaScript或者使用jQuery这两种主流技术来实现。下面详细介绍这两种方法。 首先,原生JavaScript方法是前端开发中最基础的操作之一。通过原生JavaScript给...

    【JavaScript源代码】JavaScript中极易出错的操作符运算总结.docx

    本文主要探讨了JavaScript中几个易出错的操作符类别,包括算术运算符、比较运算符、逻辑运算符以及赋值和一元运算符的运算顺序和优先级。 首先,我们来看算术运算符。在JavaScript中,有些特殊的字面量值,如`NaN`...

Global site tag (gtag.js) - Google Analytics