先看一个例子

 

● 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. [BZOJ3261] 最大异或和 (异或前缀和,可持久化Trie)

    Description 给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类型: 1.Ax:添加操作,表示在序列末尾添加一个数x,序列的长度N+1. 2.Q l r x:询问操作, ...

  2. jump 转换进制+dp

    from Contest1024 - 省选模拟题14 题目大意 MMM站在x=0的地方,她想跳到x=t的地方.MMM每次跳跃可以选择跳到x - k或者x + k的地方,其中k={base^n | ba ...

  3. 卡牌游戏(bzoj 3191)

    Description   N个人坐成一圈玩游戏.一开始我们把所有玩家按顺时针从1到N编号.首先第一回合是玩家1作为庄家.每个回合庄家都会随机(即按相等的概率)从卡牌堆里选择一张卡片,假设卡片上的数字 ...

  4. 【CF1015A】Points in Segments(签到)

    题意:有一条上面有n个点的数轴,给定m次操作,每次覆盖(x[i],y[i]),求最后没有被覆盖过的点的数量与他们的编号 n,m<=100 思路: #include<cstdio> # ...

  5. mfc对话框嵌入Flash的交互(转)

    原文转自 http://blog.csdn.net/yacper/article/details/5021081 研究Flash嵌入游戏中的可行性....... 渲染问题已解决 事件响应已解决 下面是 ...

  6. Firmware 加载原理分析【转】

    转自:http://blog.csdn.net/dxdxsmy/article/details/8669840 [-] 原理分析 实现机制 总结   前言 前段时间移植 wifi 驱动到 Androi ...

  7. yii 数据save后得到插入id

    $model->save();//得到上次插入的Insert id$id = $model->attributes['id'];如此很简单

  8. 在 NetBeans 中开发一般 Java 应用程序时配置 Allatori 进行代码混淆

    要在 NetBeans 中开发一般 Java 应用程序时利用 Allatori 进行代码混淆,设置比 IntelliJ IDEA 稍微简单一点,首先在 NetBeans 项目所在硬盘目录内创建一个名为 ...

  9. MongoDB状态查询详解:db.serverStatus()

    https://www.2cto.com/database/201501/370191.html

  10. AC日记——Dishonest Sellers Codeforces 779c

    C. Dishonest Sellers time limit per test 2 seconds memory limit per test 256 megabytes input standar ...