美股三大股指全面下跌,特斯拉上漲 4.34%,嗶哩嗶哩漲逾 5%
阿新 • • 發佈:2021-11-11
定義:
Object.assign()用於物件的合併,將源物件(source)的所有可列舉屬性,複製到目標物件(target),並將目標物件返回出來。
const target = { a: 1 } const source1 = { b: 2 } const source2 = { c: 3 } const result = Object.assign(target, source1, source2) console.log(target) // {a: 1, b: 2, c: 3} console.log(result) // {a: 1, b: 2, c: 3}
如果目標物件和源物件有同名屬性,後面的屬性會覆蓋前面的屬性
const target = { a: 1 } const source1= { b: 2, a: 100 } const source2 = { c: 3, b: 200 } const result = Object.assign(target, source1, source2) console.log(target) // {a: 100, b: 200, c: 3} console.log(result) // {a: 100, b: 200, c: 3}
以上兩點特徵使用物件的【解構賦值】效果一樣
const target = { a: 1 } const source1 = { b: 2, a: 100 } const source2= { c: 3, b: 200 } const result = Object.assign(target, source1, source2) const result1 = { ...target, ...source1, ...source2 } console.log(target) // {a: 100, b: 200, c: 3} console.log(result) // {a: 100, b: 200, c: 3} console.log(result1) // {a: 100, b: 200, c: 3}
Object.assign()如果只有一個引數,會直接返回這個引數
const obj = { a: 1 } console.log(Object.assign(obj) === obj) // true
如果該引數不是物件,則會先轉成物件,然後返回
console.log(Object.prototype.toString.call(Object.assign(2))) // [object Number] console.log(Object.prototype.toString.call(Object.assign(NaN))) // [object Number] console.log(Object.prototype.toString.call(Object.assign(true))) // [object Boolean] console.log(Object.prototype.toString.call(Object.assign('abc'))) // [object String] console.log(Object.prototype.toString.call(Object.assign(new Date()))) // [object Date]
undefined和null無法轉成物件,如果用它們作為引數,就會報錯
console.log(Object.prototype.toString.call(Object.assign(undefined))) // Uncaught TypeError: Cannot convert undefined or null to object console.log(Object.prototype.toString.call(Object.assign(null))) // Uncaught TypeError: Cannot convert undefined or null to object如果源物件(source)不是一個物件,處理規則有所不同。這些引數都會轉成物件,如果不能轉就會跳過。這意味著,undefined和null不在首位就不會報錯
const obj = { a: 1 } console.log(Object.assign(obj) === obj) // true console.log(Object.assign(obj, undefined) === obj) // true console.log(Object.assign(obj, null) === obj) // true
其他資料型別的值,不在首位(target)也不會報錯,但是,除了字串會以陣列形式,拷貝入目標物件,其他值都不會產生效果
const s1 = 'abc' const s2 = true const s3 = 100 const s4 = NaN const s5 = new Date() const obj = {} Object.assign(obj, s1, s2, s3, s4, s5) console.log(obj) // {0: 'a', 1: 'b', 2: 'c'}
因為只有字串的包裝物件,會產生可列舉屬性
使用Object()將字串、數字、布林值、NaN、Date轉成對應的包裝物件,可以看到它們的原始值都在包裝物件的內部屬性 [[PrimitiveValue]] 上面,這個屬性是不會被Object.assign()拷貝的。只有字串的包裝物件,會產生可列舉的實義屬性,這些屬性才可以被拷貝
原型鏈上的屬性不會被Object.assign()拷貝
Object.prototype.age = 100 const target = {} const source = { name: '小明' } Object.assign(target, source) console.log(target) // {name: '小明'}
不可列舉屬性不會被Object.assign()拷貝
const target = {} const source = { name: '小明' } Object.defineProperty(source, 'latent', { value: '我是一個隱藏的屬性', enumerable: false // 預設為false,不可列舉 }) Object.assign(target, source) console.log(target) // { name: '小明' }
屬性名為Symbol值的屬性,會被Object.assign()拷貝
const target = {} const source = { name: '小明' } Object.defineProperty(source, 'latent', { value: '我是一個隱藏的屬性', enumerable: true }) Object.assign(target, source, { [Symbol('xx')]: 'xx' }) console.log(target) // {name: '小明', latent: '我是一個隱藏的屬性', Symbol(xx): 'xx'}
Object.assign(null)