js的对象赋值问题:值传递还是引用传递?

ECMAScript中有5种简单数据类型(也称为基本数据类型):Undefined、Null、Boolean、Number和String。还有1种复杂数据类型——Object,Object本质上是由一组无序的名值对组成的。ECMScript不支持任何创建自定义类型的机制,而所有值最终都将是上诉6中数据类型之一。乍一看,好像只有6种数据类型不足以表示所有数据;但是,由于ECMScript数据类型具有动态性,因此的确没有再定义其他类型的必要了。

赋值:

对于5种基本数据类型,相互赋值,是直接值传递的。如下:

var a = 1;
var b = a;
a = 2;
alert(b);    // 1,值未变
 
var str1 = "aaa";
var str2 = str1;
str1 = "bbb";
alert(str2);    // aaa,值未变

但对于复杂数据类型Object,直接赋值,结果是引用传递。如下:

var array1 = [1, 2, 3];
var array2 = array1;
array1[0] = 100;
alert(array2);    // [100, 2, 3],值跟着array1改变
 
var obj1 = {"a":1};
var obj2 = obj1;
obj1["a"] = 2;
alert(obj2);    // {"a":2}, 值跟着obj1改变
开发中经常会遇到对象间赋值,只用做到值传递,如何实现呢?

这里用到的方法是:Object.assign(),该方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。

见如下代码:

// 数组
var array1 = [1, 2, 3];
var array2 = Object.assign([], array1);
array1[0] = 100;
console.log(array2);    // [1, 2, 3],值未变
 
// 对象
var obj1 = {"a":1};
var obj2 = Object.assign({}, obj1);
obj1["a"] = 2;
console.log(obj2);        // {"a":1}, 值未变

————————————————
版权声明:本文为CSDN博主「amCharlie」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u012337114/article/details/80404855

 

PS:

Object.assign() 不支持深拷贝

因为assign()拷贝的是属性值。假如源对象的属性值是一个对象的引用,那么它也只指向那个引用。

json对象可以试着使用: 

JSON.parse(JSON.stringify(obj1))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值