由ECMA规范来看连续赋值
2016-01-26 00:53
381 查看
首先我们来看一段代码:
这段代码会输出什么呢?
我们首先来看一下对规范对于赋值操作
总共有4个步骤
1. 计算表达式
2. 计算表达式
3. 将
4. 返回
以上的4个步骤也就说明了js的表达式是由右至左的(大部分语言都是这样)
用这种方式来看我们的连续赋值:
一、进行的是取地址过程:
1. 取出
2. 取出
3. 取出
4. 取出
二、进行的是取值过程:
1. 取出
三、进行赋值过程:
1. 将
2. 将
3. 将
最终
下面来看我们文章一开始的那段代码:
首先我们将
然后我们在计算
而后将
所以文章开始代码的输出为
var a = {n: 1}; var b = a; a.x = a = {n: 2}; console.log(a.x); console.log(b.x);
这段代码会输出什么呢?
我们首先来看一下对规范对于赋值操作
A=B的解释,这一操作的背后究竟发生了什么?
总共有4个步骤
1. 计算表达式
A,得到
A的地址
refA
2. 计算表达式
B,得到
B的值
valueB
3. 将
valueB赋值给
refA指向的名称绑定
4. 返回
valueB
以上的4个步骤也就说明了js的表达式是由右至左的(大部分语言都是这样)
用这种方式来看我们的连续赋值:
A = B = C = D我们可以看成
A = (B = (C = D))
一、进行的是取地址过程:
1. 取出
A的地址
refA
2. 取出
B的地址
refB
3. 取出
C的地址
refC
4. 取出
D的地址
refD
二、进行的是取值过程:
1. 取出
D的值
valueD
三、进行赋值过程:
1. 将
valueD赋值给
refC指向的变量,返回
valueD
2. 将
valueD赋值给
refB指向的变量,返回
valueD
3. 将
valueD赋值给
refA指向的变量,返回
valueD
最终
A,B,C三个变量的值全部变为
D的值
下面来看我们文章一开始的那段代码:
首先我们将
a.x与
a的地址分别取出来,在这里分别记为
ref1,ref2
然后我们在计算
{n: 2},得到一个值
value1(也就是一个指针),保存着该对象在内存中的地址
而后将
value1赋值给
ref1所指向的变量,对应的对象
a的地址也会被改变,很多人会有疑问说,这是
ref2的地址会不会变化,显然是不会的,因为
ref2只是我们的一个指针,它的值指向的是原来对象
a在内存中对应对象的地址(
a的指向改变后,
b仍指向这片地址),下面就是将
value1赋值给
ref1,这时
ref1的指向被改变,指向内存中
{n: 2}对象对应的地址。
所以文章开始代码的输出为
undefined和
{n: 2}
相关文章推荐
- 运维小知识之nginx---nginx配置Jboss集群负载均衡
- 英汉词典开发文件
- iceweasel 安装flash player
- Android(一)onCreate方法
- JAVA中的代码块
- hdu 3635 Dragon Balls(并查集)
- 使用@Controller注解为什么要配置<mvc:annotation-driven />
- Codeforces Round #271 (Div. 2) 总结
- HDU 2859 Phalanx
- Odd Even Linked List
- KindEditor编辑器的使用
- Baby-Step Giant-Step 解高次同余方程(形如(a^x)%n=b,其中n为素数)
- Codeforces-Round #340 解题报告
- 一个开源Delphi分类组件推荐网页
- export 原理解析 (Shell Script)
- js获取网页高度(详细整理)
- JNA调用DLL一点小结
- Linux私房菜阅读笔记
- 如何阅读别人写的项目
- 顺序表的增删改查实现