a=b=c 连等赋值的分析
首先 先抛出两个例子,大家想想结果是什么?
eg1:
var a = 1;
var b = a;
a.x = a = 3;
问 a = ? | b = ? | a.x = ?
eg2:
var a = {n:1};
var b = a;
a.x = a = {n:2};
问 a = ? | b = ? | a.x = ?
要通透的理解这个问题,首先我们必须要理解 javascript中,数据的存储方式;
首先,javascript 的数据类型分两类:
基本数据类型:String Number Boolean null undefined
引用数据类型:Object
然后,需要了解的是,数据的存储分两种方式:
桟(stack) 、堆(heap)
基本数据类型 存储在 桟(stack)中, 引用数据类型 存储在 堆(heap)中;
(对 数据类型 、桟 和 堆 的 具体了解,可参见我这篇博客:《javascript 基本数据类型、引用数据类型》)
在此呢,做一下简单的概括总结:
最重要的一句话:在javascript中所有的赋值都是值的赋值;
基本数据类型 赋值:
是复制一份 变量a 的值 作为 变量b 的值;此时,变量a的值 与 变量 b的值 是在桟中的两个不同位置存储的相等的值;此后,改变 任何一个变量的值,对另一个都是没有任何影响;
配合一张 我再 《javascript 基本数据类型、引用数据类型》中的一张图 感觉 理解起来更明白些,如下:

引用数据类型赋值:
是复制一份 变量a 的 所指对象的引用地址值 作为 变量b 的值;此时,变量a的值 与 变量 b的值 是在桟中的两个不同位置存储的相等的引用地址值,这两个地址都指向一个共同的在堆中存储着的对象;
而 我们通过变量改变其属性,其实是 变量 -->通过 对象在堆中地址 -->找到 对象,然后修改它的 属性;
而此时,其它指向这个共用对象的其它变量,获取对象时,获取的就是这个改变之后的对象了;
配合一张 我再 《javascript 基本数据类型、引用数据类型》中的一张图 理解一下,如下:

至此,如果大家都了解了 上述所讲的话,很容易就能 得出 开头两个例子的结果了;
我们先看一下 eg1 的分析:

所以,最后的结果,a: 3, b: 1, a.x: undefined
再看 eg2 的分析:

所以,最后结果 a: {n:2}, b: {n:1, x:{n:2}}, a.x: undefined, b.x: {n:2}
简单得到 a=b=c 最后 a,b 指向的方法:
先创建了 一个c, c可以是 基本数据类型值,也可以是 引用数据类型值 一个对象;
然后,从左往右 分别把 c 赋值给前面的两个变量:a=c b=c,顺序执行;
最后可得到正确结果;
总结:对于连等赋值,最重要的是要明确两点:
1.所有的赋值 都是 值得赋值(这个值 可能是一份值的复本-->基本数据类型, 可能是 对象的引用地址 的 复本 ---> 引用数据类型)
2.要明确 最后输出时,变量的指向
a=b=c 连等赋值的分析的更多相关文章
- 07-阻塞赋值与非阻塞赋值原理分析——小梅哥FPGA设计思想与验证方法视频教程配套文档
芯航线--普利斯队长精心奉献 实验目的:掌握阻塞赋值与非阻塞赋值的区别 实验平台:无 实验原理: 阻塞赋值,操作符为"=","阻塞"是指在进程语句( ...
- Oracle中Clob类型处理解析:ORA-01461:仅可以插入LONG列的LONG值赋值
感谢原作者:破剑冰-Oracle中Clob类型处理解析 上一篇分析:ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值 最近为Clob字段在插入数据时发现当字符的字节数(一个半角字符一 ...
- 矩阵赋值实例(matrixAssign)
题目:给一个二维数组赋值. 分析:主机端代码完成的主要功能: 启动CUDA,使用多卡时应加上设备号,或使用cudaSetDevice()设置GPU设备. 为输入数据分配内存空间 初始化输入数据 为GP ...
- Mybatis源码分析之结果集处理
解析封装 ResultMap 是和结果集相关的东西,最初在解析 XML 的时候,于 parseStatementNode 方法中,针对每一个 select 节点进行解析,转换为 MappedState ...
- Oracle中Clob类型处理解析
最近利用NHibernate映射类型为Clob字段在插入数据时发现当字符的字节数(一个半角字符一个字节,一个全角字符两个字节)在2000-4000之间时报错(ORA-01461:仅可以插入LONG列的 ...
- MVC5框架解析之Controller的创建
在上一讲中我们介绍了MvcHandler,知道在Handler里面注入两个接口属性分别为IControllerFactory和IController的factory和controller.并且通过IO ...
- WPF 自定义Button控件及样式
这次通过最近做的小例子说明一下自定义Button控件和样式. 实现的效果为:
- STL跨DLL使用
今天在写一个函数,需要将map作为一个引用参数传入函数体内部进行赋值,结果编译通过,执行时总是崩溃,在网上找到了一些作者写的blog,详细解释了这种情况发生的原因,特转载在这里,便于自己今后查询. 原 ...
- python 学习笔记 3 ----> dive into python 3
Python内置数据类型 注意: Python可以不需要声明变量的数据类型.它是根据变量的初始赋值情况分析数据类型,并在内部跟踪变量. 比较重要的数据类型: 1 布尔型(Booleans):True. ...
随机推荐
- Java连接MongoDB样例
package com.moonlit.example; import com.mongodb.BasicDBObject; import com.mongodb.BulkWriteOperation ...
- GitHub Pages站点官方宣布开始使用HTTPS
导读 数百万人依靠GitHub Pages,将其作为他们的网站主机,除此之外,还有数百万人每天访问这些网站.为了更好地保护到GitHub Pages站点的通讯,也为了鼓励在因特网上更广泛地采用HTTP ...
- Json数组基础知识
1.对象是一个无序的“‘名称/值’对”集合. (1)一个对象以“{”(左括号)开始,“}”(右括号)结束. (2)每个“名称”后跟一个“:”(冒号): (3)“‘名称/值’ 对”之间使用“,”(逗号) ...
- [转]Mac下cocos2dx-3.2+Xcode环境配置和项目创建
原文:http://blog.csdn.net/u012200908/article/details/38070885 这是有关环境配置的第二篇教程,第一篇讲的是win8下的环境配置.这里我们使用C+ ...
- 1:TwoSum(如果两个和为某个数,找出这俩数的位置)
package leetcode; import java.util.HashMap; import java.util.Map; /** * @author mercy *Example: *Giv ...
- js 高程 函数节流 throttle() 分析与优化
在 js 高程 22.3.3章节 里看到了 函数节流 的概念,觉得给出的代码可以优化,并且概念理解可以清晰些,所以总结如下: 先看 函数节流 的定义,书上原话(斜体表示): 产生原因/适用场景: 浏览 ...
- 轻松六步教会你如何修改system.img.ext4文件
http://bbs.xiaomi.cn/thread-2943923-1-1.html 希望更多的ROM作者,看了此教程后,学会ROM制作,给大家带来更多更好的ROM 首先下载如下包 Linux U ...
- 01. Java序列化与反序列化简介
Java对象的序列化与反序列化 ; 给大家讲解一下什么是序列化 & 反序列化 当两个进程进行远程通讯的时候,彼此相互可以发送各种类型的数据,如文本,图片,语音和视频等无论是任何类型,最终都会 ...
- python基础-第四篇-4.1内置函数
lambda表达式 lambda表达式是对简单函数的精简化表达 语法结构:函数名 = lambda:运算表达式 def f1(a): a = a + 1 return a ret = f1(1) pr ...
- 转!mysql 命令行下 通过DELIMITER临时改变语句分隔符 执行存储过程
mysql 在 Navicat 界面工具 执行存储过程ok,但是在命令行下执行失败. 原因在于,默认的MySQL语句分隔符为' ; ',在输入' ; '的时候,“以为”语句已经结束了,但实际上语句还没 ...