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

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 = 也是指向 a 的表达式而已。

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

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

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

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

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

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

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

你真的理解js的赋值语句么的更多相关文章

  1. 好程序员web前端分享如何理解JS的单线程

    好程序员web前端分享如何理解JS单线程,JS本质是单线程的.也就是说,它并不能像JAVA语言那样,两个线程并发执行. 但我们平时看到的JS,分明是可以同时运作很多任务的,这又是怎么回事呢? 首先,J ...

  2. 我想这次我真的理解了 JavaScript 的单线程机制

    今天面试的时候被问到一个问题,是关于 JS 异步的.当时我脑海中闪过了一个单线程的概念,但却没有把真正的原理阐述清楚.所以回来特意重新回顾了前面单线程和异步相关的一些知识点. 虽然之前学习的时候也接触 ...

  3. 简单粗暴地理解js原型链–js面向对象编程

    简单粗暴地理解js原型链–js面向对象编程 作者:茄果 链接:http://www.cnblogs.com/qieguo/archive/2016/05/03/5451626.html 原型链理解起来 ...

  4. 【学习笔记】深入理解js原型和闭包(15)——闭包

    前面提到的上下文环境和作用域的知识,除了了解这些知识之外,还是理解闭包的基础. 至于“闭包”这个词的概念的文字描述,确实不好解释,我看过很多遍,但是现在还是记不住. 但是你只需要知道应用的两种情况即可 ...

  5. 【学习笔记】深入理解js原型和闭包(14)——从【自由变量】到【作用域链】

    先解释一下什么是“自由变量”. 在A作用域中使用的变量x,却没有在A作用域中声明(即在其他作用域中声明的),对于A作用域来说,x就是一个自由变量.如下图 如上程序中,在调用fn()函数时,函数体中第6 ...

  6. 【学习笔记】深入理解js原型和闭包(13)——【作用域】和【上下文环境】

    上文简单介绍了作用域,本文把作用域和上下文环境结合起来说一下,会理解的更深一些. 如上图,我们在上文中已经介绍了,除了全局作用域之外,每个函数都会创建自己的作用域,作用域在函数定义时就已经确定了.而不 ...

  7. 【学习笔记】深入理解js原型和闭包(8)——简述【执行上下文】上

    什么是“执行上下文”(也叫做“执行上下文环境”)?暂且不下定义,先看一段代码: 第一句报错,a未定义,很正常.第二句.第三句输出都是undefined,说明浏览器在执行console.log(a)时, ...

  8. 【学习笔记】深入理解js原型和闭包(2)——函数和对象的关系

    上文(深入理解jS原型和闭包(1)——一切都是对象)已经提到,函数就是对象的一种,因为通过instanceof函数可以判断. var fn = function () { }; console.log ...

  9. 您真的理解了SQLSERVER的日志链了吗?

    您真的理解了SQLSERVER的日志链了吗? 先感谢宋沄剑给本人指点迷津,还有郭忠辉童鞋今天在QQ群里抛出的问题 这个问题跟宋沄剑讨论了三天,再次感谢宋沄剑 一直以来,SQLSERVER提供了一个非常 ...

随机推荐

  1. Azure SQL Database Active Geo-Replication 简介

    对于数据库的维护来说,备份工作可谓是重中之重.MS Azure 当然也提供了很完善的数据库备份功能.但是在动手创建备份计划前请思考一下备份工作的真实目的.当然首先要保证数据的安全,一般来说定时创建数据 ...

  2. React笔记-首次渲染

    渲染机制 渲染机制主要分为两部分: 首次渲染和更新渲染. 首次渲染 首先通过一个小例子,来讲解首次渲染过程. <!DOCTYPE html> <html lang="en& ...

  3. LintCode——Chalkboard XOR Game(黑板游戏)

    黑板游戏: We are given non-negative integers nums[i] which are written on a chalkboard. Alice and Bob ta ...

  4. Vue.js 相关知识(路由)

    1. 简介 路由,工作原理与路由器相似(路由器将网线总线的IP分发到每一台设备上),Vue中的路由根据用户在网页中的点击,将其引导到对应的页面. 2. 使用步骤 安装vue-router或者直接引入v ...

  5. Linux内核分析作业 NO.2

    操作系统是如何工作的 于佳心 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000  ...

  6. Daily Scrum – 12/10

    Meeting Minutes 完了了部分页面设计,可能是没有完成的原因,感觉好丑= =: 完成了调整速度的条: 讨论了页面翻转的实现方式,以及可能的简化方式: 进一步整合各个组件: 改进页面上移的按 ...

  7. Alpha冲刺第4天

    Alpha第四天 1.团队成员 郑西坤 031602542 (队长) 陈俊杰 031602504 陈顺兴 031602505 张胜男 031602540 廖钰萍 031602323 雷光游 03160 ...

  8. 累计进度条 PSP

    每周例行报告 本周PSP 类别 任务 开始时间 结束时间 被打断时间 总计工作时间    11月16日 代码 参与团队项目 10:05 12:12 15 112min 写博客 进度统计 21:52 2 ...

  9. ehcache、redis应用场景比较

    应用场景: ehcache是Hibernate中默认的CacheProvider,直接在jvm虚拟机中缓存,速度快,效率高:但是缓存共享麻烦,集群分布式应用不方便.  . 缓存数据有两级:内存和磁盘, ...

  10. poj1064 Cable master

    Description Inhabitants of the Wonderland have decided to hold a regional programming contest. The J ...