zoukankan      html  css  js  c++  java
  • 你真的理解js的赋值语句么

    之前谢亮兄和我一起讨论的一个问题:

    var a = {};
    a.x = a = 3;

    a 的值是什么。

    其实当执行赋值语句的时候,js 的 = 左侧不是原始变量地址,而是一个新值
    怎么理解这句话呢?

    来看下ECMA对 = 的定义吧。《11.13 Assignment Operators
    当然看不懂也没关系,我也是半懂不懂的简单理解了下。

    文档中说 LeftHandSideExpression = AssignmentExpression
    中文翻译为:左手边表达式 = 赋值表达式

    虽然不知道什么意思,不过很明显,左侧的不是原始地址,应该是一个表达式。

    我们来解释下这个吧。

    var a = {};
    a.x = a = 3;
    console.log(a); // 3

     var a = {};  这个完全没问题,完全可以理解。。
    那我们来详细解释下  a.x = a = 3;  是怎么回事吧。
    用 左手边表达式 = 赋值表达式 原则套用下,相当于:
    左手边表达式 = (左手边表达式 = 赋值表达式)

    a.x 不再指向 a.x, 而是属性 x 的一个准备被赋值的表达式。
    同样 a = 3 也是指向 a 的表达式而已。

    也就是 a 被赋值为 3,原来那个对象的 x 属性被复制为 3
    其实很容易就可以验证刚才的说法。

    var a = {};
    b = a;
    a.x = a = 3;
    console.log(a); // 3
    console.log(b); // {x:3}

    执行后 a 是 3, 同时 b.x 也是 3

    可能前面说的左手边表达式不太容易理解,看下这个例子吧:

    var obj = {n: 0};
    function fn() { return obj; }
    
    fn().n = 123;
    console.log(obj);
    

    这个就很直观了,左手边表达式的意思就是,左侧可以是一个"表达式",当然不是真正意义上的表达式,你看这里就是调用了一个函数,但是n的值确实变成了 123

    不知道各位客官理解了没,这个东西确实不好解释清楚。如果哪里说的不对,还望大神调教。。

  • 相关阅读:
    android 解密工具
    android打包需要的图标
    Mac 创建软链接
    历届试题 Excel地址
    算法训练 字串统计
    最长回文子串
    算法提高 P1001【大数乘法】
    算法提高 拿糖果【埃氏筛 动态规划】
    算法训练 未名湖边的烦恼
    算法提高 合并石子【动态规划】
  • 原文地址:https://www.cnblogs.com/52cik/p/js-assignment-operators.html
Copyright © 2011-2022 走看看