因为 js 对象是地址引用,所以,当把一个对象赋值给目标对象,改变目标对象的属性也会改变原对象的属性。
方法一:Object.assign(target, source)
- 复制对象
var userInfo = {
name: 'golden',
age: 20
};
var cloneUserInfo = Object.assign({},userInfo);
cloneUserInfo.weight = 120;
console.log(userInfo)//{"name":"golden","age":20}
console.log(cloneUserInfo);//{"name":"golden","age":20,"weight":120}
- 复制数组
var list = [1,2,3];
var cloneList = Object.assign([],list);
cloneList.push(4);
console.log(list, cloneList) // [1,2,3],[1,2,3,4]
方法二:es6 的展开运算符 ...
var list = [1,2,3];
var cloneList = [...list];
方法三:JSON对象序列化方法。
弊端:函数不能被复制
var obj = {
a:1,
b:2,
fn(){
return '函数'
}
}
var newObj = JSON.parse(JSON.stringify(obj));
newObj.c = 3;
console.log(obj,newObj);// {a:1,b:2,fn:fn()},{a:1,b:2,c:3}
// 此处的 newObj 未成功获取到fn属性。