赞
踩
S中的对象操作,我们需要把A对象的值赋给B,修改B后,而A不受影响。
那如何要JS只将值赋给另一个对象,而不是把地址赋给另一个对象,导致改变影响源对象?
Object.assign(target, ...sources) // target:目标对象;sources:源对象
JSON.parse(JSON.stringify(obj))
Object.assign(target, ...sources)
Object.assign()
方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。
- assign()并不会深层复制,如果对象里还套有对象,则相关属性还是存在关联性的。
- Object.assign 不会在那些source对象值为 null 或 undefined 的时候抛出错误。
Object.assign()
方法的Demo;不可以深层复制
。const target = { a: 1, b: 2 }; const source1 = { b: 4, c: 5, inner:{ sou: 9} }; const source2 = { e: 60, f: 70 }; const returnedTarget = Object.assign(target, source1,source2); returnedTarget.inner.sou = "change" // 改变内部对象 console.log(target); // expected output: { a: 1, b: 4, c: 5, inner: { sou: "change" }, e: 60, f: 70 } console.log(source1); // expected output: { b: 4, c: 5, inner: { sou: "change" } } console.log(source2); // expected output: { e: 60, f: 70 } console.log(returnedTarget); // expected output: { a: 1, b: 4, c: 5, inner: { sou: "change" }, e: 60, f: 70 }
JSON.parse(JSON.stringify(obj))
JSON.parse(JSON.stringify(obj))
方法相对一般的浅复制(将地址赋给另一个对象),而方法2属于深复制。
利用JSON.stringify()
将js对象序列化成为字符串,然后通过JSON.parse()
来反序列化(还原)js对象;因为字符串复制的是赋值而不是赋地址,这样就实现了对象复制且不和原对象产生关联。
- 源对象中有时间对象,转换后,时间将变成字符串格式,而不再是时间对象了。
- 源对象中里有
RegExp
、Error
时,则序列化的结果将只得到空对象。- 源对象中的属性有
undefined
时,该属性不会复制,会丢失。- 源对象中的属性有
function()
时,无法复制 。
JSON.parse(JSON.stringify(obj))
方法的Demo;可以深层复制
。const source = { b: 4, c: 5, inner:{ sou: 9} };
const returnedTarget = JSON.parse(JSON.stringify(source));
returnedTarget.inner.sou = "change" // 改变内部对象
console.log(source);
// expected output: { b: 4, c: 5, inner: { sou: 9 } }
console.log(returnedTarget);
// expected output: { b: 4, c: 5, inner: { sou: "change" }}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。