js对象深度拷贝、Object.assign()、Object.assign()复制非对象、Object.assign()浅拷贝
2018-03-11 14:30
816 查看
把对象target1,target2,...合并到对象origin上
Object.assign(origin,target1,target2,....);
例1:合并的是对象
var origin = {
a:'a'
},
target1 = {
b:'b'
},
target2 = {
c:'c'
}
Object.assign(origin,target1,target2);
origin改变
console.log(origin) // {a:'a',b:'b',c:'c'}
例2: 合并的值是 数字、控制符串 ''、布尔值(false或true)、undefined、null
var origin = {a:'a'},
target1 = 1;
Object.assign(origin,target1);
origin不改变:
console.log(origin) // {a:'a'}
例3: 合并的是数组
var origin = {a:'a'},
target1 = [12,123];
Object.assign(origin,target1)
target1会被以 索引为属性,值为属性值复制到origin
console.log(origin) // {0:12,1:123,a:'a'}
如果原对象有0,1之类的属性会被替换值
var origin = {0:0,a:'a'},
target1 = [12,123];
Object.assign(origin,target1)
console.log(origin) // {0:12,1:123,a:'a'}
例4:合并的是非空字符串
var origin = {a:'a'},
target1 = 'nihao啊';
Object.assign(origin,target1);
字符串会被以索引为属性,值为属性值复制到origin
console.log(origin) // {0:'n',1:'i',2:'h',3:'a',4:'o',5:'啊',a:'a'}
以上只有一层值的时候拷贝是没问题的,即拷贝之后,origin和target1的值再改变时是不会相互影响的
例5:拷贝的对象有两层及以上的时候,拷贝之后会相互影响,target1改变 origin也会跟着改变
var origin = {a:'a'},
target1 = {
b:{c:1}
};
Object.assign(origin,target1);
console.log(origin) // {a:'a',b:{c:1}}
target1.b.c++
console.log(origin) // {a:'a',b:{c:2}}
target1改变 origin也改变了。
综上Object.assign()是浅拷贝
// 深度拷贝 function deepClone(origin, target) { var target = target || {}; for (var prop in origin) {
if (origin.hasOwnProperty(prop)) { if (origin[prop] !== null && typeof origin[prop] === 'object') { target[prop] = Object.prototype.toString.call(origin[prop]) === '[object Array]'? [] : {}; deepClone(origin[prop], target[prop]); } else { target[prop] = origin[prop] } } }
} var obj = { name: 'name', arr: [1, 2, 3], obj: { a: 'a' }, f: function () {
} } var obj1 = {}; deepClone(obj, obj1) console.log(obj1) /*
{
name: 'name',
arr: [1, 2, 3],
obj: { a: 'a' },
f: function () {
}
}
*/
obj.obj.a = 'b'; console.log(obj1)
/*
{
name: 'name',
arr: [1, 2, 3],
obj: { a: 'a' },
f: function () {
}
}
obj1不会跟随obj改变
*/
Object.assign(origin,target1,target2,....);
例1:合并的是对象
var origin = {
a:'a'
},
target1 = {
b:'b'
},
target2 = {
c:'c'
}
Object.assign(origin,target1,target2);
origin改变
console.log(origin) // {a:'a',b:'b',c:'c'}
例2: 合并的值是 数字、控制符串 ''、布尔值(false或true)、undefined、null
var origin = {a:'a'},
target1 = 1;
Object.assign(origin,target1);
origin不改变:
console.log(origin) // {a:'a'}
例3: 合并的是数组
var origin = {a:'a'},
target1 = [12,123];
Object.assign(origin,target1)
target1会被以 索引为属性,值为属性值复制到origin
console.log(origin) // {0:12,1:123,a:'a'}
如果原对象有0,1之类的属性会被替换值
var origin = {0:0,a:'a'},
target1 = [12,123];
Object.assign(origin,target1)
console.log(origin) // {0:12,1:123,a:'a'}
例4:合并的是非空字符串
var origin = {a:'a'},
target1 = 'nihao啊';
Object.assign(origin,target1);
字符串会被以索引为属性,值为属性值复制到origin
console.log(origin) // {0:'n',1:'i',2:'h',3:'a',4:'o',5:'啊',a:'a'}
以上只有一层值的时候拷贝是没问题的,即拷贝之后,origin和target1的值再改变时是不会相互影响的
例5:拷贝的对象有两层及以上的时候,拷贝之后会相互影响,target1改变 origin也会跟着改变
var origin = {a:'a'},
target1 = {
b:{c:1}
};
Object.assign(origin,target1);
console.log(origin) // {a:'a',b:{c:1}}
target1.b.c++
console.log(origin) // {a:'a',b:{c:2}}
target1改变 origin也改变了。
综上Object.assign()是浅拷贝
// 深度拷贝 function deepClone(origin, target) { var target = target || {}; for (var prop in origin) {
if (origin.hasOwnProperty(prop)) { if (origin[prop] !== null && typeof origin[prop] === 'object') { target[prop] = Object.prototype.toString.call(origin[prop]) === '[object Array]'? [] : {}; deepClone(origin[prop], target[prop]); } else { target[prop] = origin[prop] } } }
} var obj = { name: 'name', arr: [1, 2, 3], obj: { a: 'a' }, f: function () {
} } var obj1 = {}; deepClone(obj, obj1) console.log(obj1) /*
{
name: 'name',
arr: [1, 2, 3],
obj: { a: 'a' },
f: function () {
}
}
*/
obj.obj.a = 'b'; console.log(obj1)
/*
{
name: 'name',
arr: [1, 2, 3],
obj: { a: 'a' },
f: function () {
}
}
obj1不会跟随obj改变
*/
相关文章推荐
- JS 对象复制Object.assign和Object.create
- JavaScript 复制对象与Object.assign方法无法实现深复制
- js 对象和Json的转换,js及深度复制
- JavaScript 对象拷贝与Object.assign
- es6 javascript对象方法Object.assign() 对象的合并复制等
- js object对象赋值bug和对象复制clone方法
- js对象简单、深度克隆(复制)
- js数组对象深度复制
- JavaScript 复制对象【Object.assign方法无法实现深复制】
- Object 对象方法学习之(1)—— 使用 Object.assign 复制对象、合并对象
- Object 对象方法学习之(1)—— 使用 Object.assign 复制对象、合并对象
- JS学习30:对象简单、深度克隆(复制、Clone)
- js中对象的复制,浅复制(浅拷贝)和深复制(深拷贝)
- JavaScript 中的对象深度复制(Object Deep Clone)
- JS中对象object的复制
- js实现对象深度拷贝
- js 合并多个对象 Object.assign
- 【坑】【数组的坑】1、对象assign复制的假深度,2、数组slice复制的坑,3、还有数组map复制的坑
- js深度复制对象
- js 对象的深度复制