js内置对象
Js 標準內置對象
Object
Object 是 JavaScript 的一種數據類型。它用于存儲各種鍵值集合和更復雜的實體。可以通過 Object() 構造函數或者使用對象字面量的方式創建對象。
Object.assign()
Object.assign() 靜態方法將一個或者多個源對象中所有可枚舉的自有屬性復制到目標對象,并返回修改后的目標對象。
const target = { a: 1, b: 2 };
const source = { b: 4, c: 5 };
const returnedTarget = Object.assign(target, source);
// target 目標對象 需要應用源對象屬性的目標對象,修改后將作為返回值
// source 源對象
console.log(target);
// Expected output: Object { a: 1, b: 4, c: 5 }
描述
如果目標對象與源對象具有相同的鍵(屬性名),則目標對象中的屬性將被源對象中的屬性覆蓋,后面的源對象的屬性將類似地覆蓋前面的源對象的同名屬性。
Object.assign() 方法只會拷貝源對象可枚舉的的自有屬性到目標對象。該方法在源對象上使用 [[Get]],在目標對象上使用 [[Set]],因此它會調用 getter 和 setter。故它對屬性進行賦值,而不僅僅是復制或定義新的屬性。如果合并源對象包含 getter 的新屬性到原型中,則可能不適合使用此方法。
如果要將屬性定義(包括它們的可枚舉性)復制到原型中,則應改用 Object.getOwnPropertyDescriptor() 和 Object.defineProperty() 方法。
字符串和 Symbol 類型屬性都會被復制。
如果賦值期間出錯,例如如果屬性不可寫,則會拋出 TypeError;如果在拋出異常之前已經添加了一些屬性,則這些屬性會被保留,而 target 對象也會被修改。
備注:
Object.assign()不會在源對象值為null或undefined時拋出錯誤
- 復制對象
const obj = { a: 1 };
const copy = Object.assign({}, obj);
console.log(copy); // { a: 1 }
-
深拷貝問題
針對深拷貝,需要使用其他辦法,因為
Object.assign()只復制屬性值。const obj1 = { a: 0, b: { c: 0 } }; const obj2 = Object.assign({}, obj1); console.log(obj2); // { a: 0, b: { c: 0 } } obj1.a = 1; console.log(obj1); // { a: 1, b: { c: 0 } } console.log(obj2); // { a: 0, b: { c: 0 } } obj2.a = 2; console.log(obj1); // { a: 1, b: { c: 0 } } console.log(obj2); // { a: 2, b: { c: 0 } } // 假如源對象是一個對象的引用,它僅僅會復制其引用值。 obj2.b.c = 3; console.log(obj1); // { a: 1, b: { c: 3 } } console.log(obj2); // { a: 2, b: { c: 3 } } // 深拷貝 const obj3 = { a: 0, b: { c: 0 } }; const obj4 = JSON.parse(JSON.stringify(obj3)); obj3.a = 4; obj3.b.c = 4; console.log(obj4); // { a: 0, b: { c: 0 } }- 合并對象
const o1 = { a: 1 }; const o2 = { b: 2 }; const o3 = { c: 3 }; const obj = Object.assign(o1, o2, o3); console.log(obj); // { a: 1, b: 2, c: 3 } console.log(o1); // { a: 1, b: 2, c: 3 },目標對象本身發生了變化 // 合并具有相同屬性的對象 const o1 = { a: 1, b: 1, c: 1 }; const o2 = { b: 2, c: 2 }; const o3 = { c: 3 }; const obj = Object.assign({}, o1, o2, o3); console.log(obj); // { a: 1, b: 2, c: 3 }屬性會被后續參數中具有相同屬性的其他對象覆蓋。
-
拷貝 Symbol 類型屬性
const o1 = { a: 1 }; const o2 = { [Symbol("foo")]: 2 }; const obj = Object.assign({}, o1, o2); console.log(obj); // { a : 1, [Symbol("foo")]: 2 } (cf. bug 1207182 on Firefox) Object.getOwnPropertySymbols(obj); // [Symbol(foo)]-
原型鏈上的屬性和不可枚舉的屬性不能被復制
-
基本類型會被封裝為對象
const v1 = "abc"; const v2 = true; const v3 = 10; const v4 = Symbol("foo"); const obj = Object.assign({}, v1, null, v2, undefined, v3, v4); // 基本類型將被封裝,null 和 undefined 將被忽略。 // 注意,只有字符串封裝對象才擁有可枚舉的自有屬性。 console.log(obj); // { "0": "a", "1": "b", "2": "c" }-
異常會中斷后續的復制
總結
- 上一篇: es笔记七之聚合操作之桶聚合和矩阵聚合
- 下一篇: 数据库系列:事务的4种隔离级别