先看一个例子

 

● var a = {n:1};

● var b = a;

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

● console.log("a.x: " + a.x); //返回值:a.x: undefined

● console.log("a.n: " + a.n); //返回值:a.n: 2

● console.log("b.x: " + b.x); //返回值:b.x: [object Object]

● console.log("b.n: " + b.n); //返回值:b.n: 1

 

要点梳理

● Javascript中对象的赋值是引用传递,即变量中存储的是地址而不是值。

● Javascript中赋值运算符“=”的优先级是除了“,”以外最低的,并且是从右向左结合的。

● Javascript中运算的顺序是从左向右的。

 

过程分析

● var a = {n:1};

● //变量a指向对象{n:1}

● var b = a;

● //变量b也指向了对象{n:1},这时变量a和变量b指向同一个对象(同一个内存地址)

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

● //这一句等价于“a.x = (a = {n:2});”,因为等号是从右向左结合的。但又由于运算过程是从左向右的,

因此该句的解析过程如下

● step1. 计算 a.x,在栈(对象的引用存储在栈中)中分配一块内存,用于保存指向堆(对象的值存储在堆中)中某处的引用,假定为 A。

● step2. 计算第一个等号的右边,其为第二个等号的求值结果(把变量a指向对象{n: 2},然后返回该引用)。

● step3. 把step2中求得的结果(指向{n:2}的引用)赋值给A。

 

将过程抽象化之后,可以描述为

● step1. 使a.x指向{n:2}。(同时,由于b与a指向同一个对象,因此b.x也指向了{n:2})

● step2. 使a指向{n:2}。

 

最后,我们再看一个例子

● function fun(){

●       var a = b = 5;

● }

● fun();

● console.log(typeof a); //返回值:undefined

● console.log(typeof b); //返回值:number

这个很好理解,第2行“var a = b = 5;”被解析成“var a = (b = 5)”,其中a是一个显式声明,b是一个隐式声明。

原作者:微米博客

如若引用 请注明出处

javascript 连续赋值(转载)的更多相关文章

  1. javascript 连续赋值(连等运算)问题研究

    前几天看到一个javascript 连续赋值的问题,运行了一下,结果出乎意料,发现这里的水真的有点深啊,连续赋值的底层机制,没有一本前端书籍有详细介绍的,自己做实验研究了一下,先来看结果: var a ...

  2. (转)深入理解javascript连续赋值表达式

    引入 今天逛园子的时候看到一道javascript面试题,是关于连续赋值的,正好最近读jQuery源码经常看到这种连续赋值的表达式,所以很感兴趣. 废话不多说,来看题: var a = {n: 1} ...

  3. 前端开发面试题-JavaScript(转载)

    本文由 本文的原作者markyun 收集总结. 介绍js的基本数据类型. Undefined.Null.Boolean.Number.String. ECMAScript 2015 新增:Symbol ...

  4. 深入理解 JavaScript 异步——转载

    本文章转载于深入理解 JavaScript 异步 前言 2014年秋季写完了<深入理解javascript原型和闭包系列>,已经帮助过很多人走出了 js 原型.作用域.闭包的困惑,至今仍能 ...

  5. JavaScript技巧[转载]

    在这篇文章中将给大家分享12个有关于JavaScript的小技巧.这些小技巧可能在你的实际工作中或许能帮助你解决一些问题. 使用!!操作符转换布尔值 有时候我们需要对一个变量查检其是否存在或者检查值是 ...

  6. JSP编程中常用的JavaScript技术(转载)

    1.<tronMouseOver=this.style.backgroundColor=’#FFFFFF’ onMouseOut=this.style.backgroundColor=”> ...

  7. JavaScript(转载自 计科学院 慕课网)

    什么是脚本语言? ①脚本语言介于HTML和C,C++,Java,C#等编程语言之间 ②脚本语言与编程语言有相似地方,其函数与编程语言类似,也有变量.与编程语言之间最大的区别是编程语言的语法和规则更为严 ...

  8. 面向对象编程思想(前传)--你必须知道的javascript(转载)

    原文地址:http://www.cnblogs.com/zhaopei/p/6623460.html阅读目录   什么是鸭子类型 javascript的面向对象 封装 继承 多态 原型 this指向 ...

  9. 深入理解JavaScript系列(转载)

    深入理解JavaScript系列 深入理解JavaScript系列(1):编写高质量JavaScript代码的基本要点 深入理解JavaScript系列(2):揭秘命名函数表达式 深入理解JavaSc ...

随机推荐

  1. Mysql之Handler_read%

    纯属自己理解,如有误导概不负责O(∩_∩)O 加索引: mysql> flush status; Query OK, rows affected (0.00 sec) mysql> flu ...

  2. 使用gcc的-finstrument-functions选项进行函数跟踪【转】

    转自:http://blog.csdn.net/jasonchen_gbd/article/details/44044899 版权声明:本文为博主原创文章,转载请附上原博链接. GCC Functio ...

  3. Yii createCommand CURD操作

    本文用作工作记录,也许有人会问为什么不用 Yii 的 Model 去操作 DB,原因很简单,Yii 的 Model 写法上是方便了很多,但是会执行多余的 SQL,打开 Yii 的执行 log 就会发现 ...

  4. python读取Excel实例

    1.操作步骤: (1)安装python官方Excel库-->xlrd (2)获取Excel文件位置并读取 (3)读取sheet (4)读取指定rows和cols内容 2.示例代码 # -*- c ...

  5. jquery鼠标点击窗口或浮动层以外关闭层【阻止冒泡事件】

    $(".up-list a.th1").click(function(){ $(this).next("ul#up-list-ul").show(); }); ...

  6. luogu P1310 表达式的值

    题目描述 对于1 位二进制变量定义两种运算: 运算的优先级是: 先计算括号内的,再计算括号外的. “× ”运算优先于“⊕”运算,即计算表达式时,先计算× 运算,再计算⊕运算.例如:计算表达式A⊕B × ...

  7. SSM框架CRUD小案例

    1.数据库准备 部门tbl_dept 员工tbl_emp 建立员工和部门的外键 2.在IDEA创建SSM项目环境 2.1配置Web模块 最上面的图是错误示范,注意!!! 在Tomcat配置了项目路径, ...

  8. 359. Logger Rate Limiter

    /* * 359. Logger Rate Limiter * 2016-7-14 by Mingyang * 很简单的HashMap,不详谈 */ class Logger { HashMap< ...

  9. 简单配置PonyDebugger

    OS的Debug 系统在github上还是有不少. PonyDebugger是看上去比较牛气的一个.尝试一下 Logo PonyDebugger 可以监控网络 NetworkTrafficDebugg ...

  10. openfire Android 学习(四)----单人聊天和多人聊天(发送消息、接收消息)

    一.单人聊天 1)发送消息: 首先要获取一个聊天窗口,getConnection()为获取连接connection的方法,调用getFriendChat()获取 [java] view plainco ...