最近在看李松峰、曹力翻译的《JavaScript高级程序设计(第三版)》。关于JS变量复制我有一些自己的理解。
基本类型变量复制
实例如下1
2
3
4
5var a = 1;
var b = a;
b = b + 1;
console.log(a);//a的值为1
console.log(b);//b的值为2
解释
- 声明变量,在内存中创建变量值,并将变量名指向该内存空间。
- 变量复制,在新的内存空间中创建前述过程中值相等的变量,将新的变量名指向新内存空间。过程如下图:
引用类型复制
实例如下1
2
3
4
5
6
7
8var a = new Object();
var b = a;
b.number = 3;
console.log(a);//{number:3}
b = new Object();
b.name = "haha";
console.log(b);//{name:"haha"}
console.log(a);//{number:3}
解释
- 变量声明,通过
new
关键字,开辟新的内存空间,并把变量名指向该内存空间。 - 变量复制,将新的变量名指向上述过程中创建的内存空间。
即两个变量指向同一内存空间
如下图:
总结
基本数据类型赋值过程即可创建新的内存空间,并将变量名指向新创建的内存。引用类型需要通过new
关键字或者obj = {}
创建新的内存空间。直接将存在的引用类型变量复制给新的变量,不会创建新的内存空间,而是将新变量名指向已存在的内存空间。