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. ...
随机推荐
- Qt 等待一段时间例如1s
QTime dieTime = QTime::currentTime().addMSecs(1000); while( QTime::currentTime() < dieTime ) QCor ...
- jsp导出到Excel
jsp模板文件 <%@ page isELIgnored="false" contentType="application/x-msdownload; charse ...
- php做图片上传功能
今天来做一个图片上传功能的插件,首先做一个html文件:text.php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transition ...
- 帧动画和骨骼json、极速、二进制对比
对比总结: 1. 帧动画的效率最高,但是图片超过一定帧数,资源图片非常大.比较适合帧数少,大量动画存在,要求效率高的场合. 骨骼json效率较低,已经不推荐使用. 骨骼极速,不支持网格等. 骨骼二进制 ...
- nexus的pom配置
<groupId>com .sms</groupId><artifactId>sms </artifactId><packaging>pom ...
- 让IIS8支持WCF的最简单方法
以前在IIS8中使用WCF时,总是参考在IIS8添加WCF服务支持这篇博文进行手工设置: 1. 首先添加MIME类型:扩展名“.svc”,MIME类型 “application/octet-strea ...
- 【Python之路】Python目录
Python基础1 -- Python由来.Python种类.编码方式, Python基础2 -- Python运算符.数据类型.enumerate.range.for循环 python基础3 -- ...
- error.log worker_connections exceed open file resource limit: 1024
不按照预期响应请求 nginx.conf中worker_connections 与ulimt -n 配置的冲突
- python console
print(sys.stdout.encoding, locale.getpreferredencoding ()) windows console : chcp 65001; 在设置了这个环境变量时 ...
- MYSQL--表分区、查看分区(转)
一. mysql分区简介 数据库分区 数据库分区是一种物理数据库设计技术.虽然分区技术可以实现很多效果,但其主要目的是为了在特定的SQL操作中减少数据读写的总量以缩减sql语句的响应时间, ...