引言
在开发过程中,咱们常常能看到 Object.assign 或 Object Spread,这两个办法都能帮忙你失去想要的对象。有的人喜爱用 Object.assign,有些人喜爱用 Object Spread,那么用哪一种比拟好呢?这篇文章就是来探讨这个问题。
Object.assign 与 Object Spread 共同点
性能
都能够实现 object 自有属性(包含 Symbol 属性)的 copy。
示例
创立 MyClass
class BaseClass {foo() {return 1;}
}
class MyClass extends BaseClass {bar() {return 2;}
}
const obj = new MyClass();
obj.baz = function() { return 3;};
obj1[Symbol.for('test')] = 4;
应用 Object Spread
const clone1 = {...obj1};
console.log(clone1); // {baz: [Function], [Symbol(test)]: 4 }
console.log(clone1.constructor.name); // Object
console.log(clone1 instanceof MyClassTwo); // false
应用 Object.assign
const clone2 = Object.assign({},obj1)
console.log(clone2); // {baz: [Function], [Symbol(test)]: 4 }
console.log(clone2.constructor.name); // Object
console.log(clone2 instanceof MyClassTwo); // false
总结
没有把 MyClass
或 BaseClass
的 properties
赋值给新的对象,阐明 只拷贝了 object 自有属性(包含 Symbol 属性)。
Object.assign 与 Object Spread 不同点
Object.assign 会触发对象的 setters, Object Spread 不会
触发 target object setters
:
class MyClassOne{set name(value){console.log('set name:', value);
}
}
const obj = new MyClassOne();
Object.assign(obj, { name:'hahah'}); // Prints "set name: hahah"
const newObj = {...obj,{name:'hahah'}}// Does **not** print
触发 Object.prototype setters
:
Object.defineProperty(Object.prototype, 'myProp', {set: () => console.log('Setter called');
});
const obj = {myProp: 42};
Object.assign({}, obj); // Prints "Setter called"
const newObj = {..obj}; // Does **not** print "Setter called"
替换实现
Object.assign({}, obj)
等于 {...obj}
兼容性比照
总结
因为 Object.assign
批改了原来的对象,所以会触发原来对象的 setters
。而 Object Spread
只是进行了一次浅拷贝,不会触发 setters
。
总结
- 这两个办法都是 ECMAScript 标准的办法,都能够放心使用。
Object.assign
兼容性会更好一点,Object Spread
兼容性也不差。- 在兼容性很容易失去解决的明天,为了防止意外触发的
setter
, 全副应用 Object Spread` 是更好的抉择。
参考
- https://thecodebarbarian.com/…
- https://cloud.tencent.com/dev…