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. ...
随机推荐
- 权限模块_整体方案说明_设计实体&映射实体_实现初始化权限数据的功能
权限模块_整体方案说明 要点说明 权限就是控制功能的使用(功能对应着URL). 对功能的控制就是对URL的访问控制. 在我们的程序中,一个功能对应一个或两个URL: 1,例如列表或删除功能,只对应一个 ...
- 剑指 offer set 28 实现 Singleton 模式
singleton 模式又称单例模式, 它能够保证只有一个实例. 在多线程环境中, 需要小心设计, 防止两个线程同时创建两个实例. 解法 1. 能在多线程中工作但效率不高 public sealed ...
- 在线制作logo
logoko:http://www.logoko.com.cn/ markmarker:http://emblemmatic.org/markmaker/#/ logomaker:https://lo ...
- MyBatis笔记——EhCache二级缓存
介绍 ehcache是一个分布式缓存框架. 我们系统为了提高系统并发,性能.一般对系统进行分布式部署(集群部署方式) 不使用分布缓存,缓存的数据在各各服务单独存储,不方便系统开发.所以要使用分布式缓 ...
- Vue基础-双向绑定:从 html 到 模板 到 渲染函数
Vue 测试版本:Vue.js v2.5.13 在 Vue 中,可以利用 v-model 语法糖实现数据的双向绑定,例如: <div id="app"> <inp ...
- 浅析pc机上如何将vmlinuz-2.6.31-14-generic解压出vmlinux
浅析pc机上如何将vmlinuz-2.6.31-14-generic解压出vmlinux luther@gliethttp:~$ vim /boot/grub/grub.cfg 可以看到我们进入的系统 ...
- sublime text 3 配置方法
一.安装sublime text 3 1>.执行sublime text 3的安装包(.exe)文件安装成功后,进入sublime的安装目录(例如:D:\Program Files\Sublim ...
- 文本情感分类:分词 OR 不分词(3)
为什么要用深度学习模型?除了它更高精度等原因之外,还有一个重要原因,那就是它是目前唯一的能够实现“端到端”的模型.所谓“端到端”,就是能够直接将原始数据和标签输入,然后让模型自己完成一切过程——包括特 ...
- mysql监控优化(三)慢查询
顾名思义,慢查询日志中记录的是执行时间较长的query,也就是我们常说的slowquery,通过设--log-slow-queries[=file_name]来打开该功能并设置记录位置和文件名.慢查询 ...
- Nginx+tomcat配置负载均衡集群
操作系统版本:Centos 6.4 Nginx版本:nginx-1.3.15.tar.gz wget http://nginx.org/download/nginx-1.5.9.tar.gz JDK版 ...