js变量操作的是值还是地址

当我们将变量赋值为原始类型(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的赋值、传参全部都是按值传递,只不过这个“值”有时候是地址而已。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容