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

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

  • 相关阅读:
    USACO Milk2 区间合并
    Codeforces 490B Queue【模拟】
    HDU 3974 Assign the task 简单搜索
    HDU 5119 Happy Matt Friends(2014北京区域赛现场赛H题 裸背包DP)
    Cin、Cout 加快效率方法
    POJ 1159 回文LCS滚动数组优化
    POJ 2479 不相交最大子段和
    POJ 1458 最长公共子序列 LCS
    在阿里最深刻的,还是职场之道给我的震撼
    精细化
  • 原文地址:https://www.cnblogs.com/52cik/p/js-assignment-operators.html
Copyright © 2011-2022 走看看