当我们将变量赋值为原始类型(undefined、null、boolean、number、string)的时候,变量直接保存这个值:
var a = 111;
var b = a; // 直接将111这个值复制到了b中
b = 222;
console.log(a); // 111
b = 222
之前:
变量名 | 变量中存的数据 |
---|---|
a | 111 |
b | 111 |
b = 222
之后:
变量名 | 变量中存的数据 |
---|---|
a | 111 |
b | 222 |
当我们将变量赋值为对象的时候,变量保存的是这个对象在内存(堆)中的地址:
var a = {z:111};
var b = a; // 将{z:111}这个对象的地址复制到b中,现在a和b指向同一个内存区域
b.z = 222;
console.log(a.z); // 输出222,因为b.z和a.z是内存中同一个地方
b.z = 222;
之前:
变量名 | 变量中存的数据 |
---|---|
a | 0xABCD(指向内存中的{z:111}) |
b | 0xABCD |
b.z = 222;
之后:
变量名 | 变量中存的数据 |
---|---|
a | 0xABCD |
b | 0xABCD |
可见b本身保存的数据没有变化,变化的是0xABCD所指向的、内存中的对象。
数组、函数也是对象,将它们赋值给变量时也保存地址
js的赋值、传参全部都是按值传递,只不过这个“值”有时候是地址而已。