Baseline Widely available
Object.assign()
éææ¹æ³å°ä¸ä¸ªæè
å¤ä¸ªæºå¯¹è±¡ä¸ææå¯æä¸¾çèªæå±æ§å¤å¶å°ç®æ 对象ï¼å¹¶è¿åä¿®æ¹åçç®æ 对象ã
const target = { a: 1, b: 2 };
const source = { b: 4, c: 5 };
const returnedTarget = Object.assign(target, source);
console.log(target);
// Expected output: Object { a: 1, b: 4, c: 5 }
console.log(returnedTarget === target);
// Expected output: true
è¯æ³
Object.assign(target, ...sources)
åæ°
target
éè¦åºç¨æºå¯¹è±¡å±æ§çç®æ 对象ï¼ä¿®æ¹åå°ä½ä¸ºè¿åå¼ã
sources
ä¸ä¸ªæå¤ä¸ªå å«è¦åºç¨ç屿§çæºå¯¹è±¡ã
ä¿®æ¹åçç®æ 对象ã
æè¿°å¦æç®æ å¯¹è±¡ä¸æºå¯¹è±¡å ·æç¸åçé®ï¼å±æ§åï¼ï¼åç®æ 对象ä¸ç屿§å°è¢«æºå¯¹è±¡ä¸ç屿§è¦çï¼åé¢çæºå¯¹è±¡ç屿§å°ç±»ä¼¼å°è¦çåé¢çæºå¯¹è±¡çåå屿§ã
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 obj = Object.create(
// foo å¨ obj çååé¾ä¸
{ foo: 1 },
{
bar: {
value: 2, // bar æ¯ä¸å¯æä¸¾ç屿§
},
baz: {
value: 3,
enumerable: true, // baz æ¯å¯æä¸¾çèªæå±æ§
},
},
);
const copy = Object.assign({}, obj);
console.log(copy); // { baz: 3 }
åºæ¬ç±»åä¼è¢«å°è£
为对象
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" }
å¼å¸¸ä¼ä¸æåç»çå¤å¶
const target = Object.defineProperty({}, "foo", {
value: 1,
writable: false,
}); // target.foo æ¯ä¸ä¸ªåªè¯»å±æ§
Object.assign(target, { bar: 2 }, { foo2: 3, foo: 3, foo3: 3 }, { baz: 4 });
// TypeError: "foo" is read-only
// è¿ä¸ªå¼å¸¸ä¼å¨ç» target.foo èµå¼çæ¶åæåº
console.log(target.bar); // 2ï¼ç¬¬ä¸ä¸ªæºå¯¹è±¡æåå¤å¶ã
console.log(target.foo2); // 3ï¼ç¬¬äºä¸ªæºå¯¹è±¡ç第ä¸ä¸ªå±æ§ä¹æåå¤å¶ã
console.log(target.foo); // 1ï¼å¼å¸¸å¨è¿é被æåº
console.log(target.foo3); // undefinedï¼å±æ§èµå¼å·²ç»ç»æï¼foo3 ä¸ä¼è¢«å¤å¶
console.log(target.baz); // undefinedï¼ç¬¬ä¸ä¸ªæºå¯¹è±¡ä¹ä¸ä¼è¢«å¤å¶
æ·è´è®¿é®å¨
const obj = {
foo: 1,
get bar() {
return 2;
},
};
let copy = Object.assign({}, obj);
console.log(copy);
// { foo: 1, bar: 2 }
// copy.bar ç弿¯ obj.bar ç getter çè¿åå¼ã
// è¿æ¯ä¸ä¸ªå°å®æ´æè¿°ç¬¦å¤å¶çèµå¼å½æ°
function completeAssign(target, ...sources) {
sources.forEach((source) => {
const descriptors = Object.keys(source).reduce((descriptors, key) => {
descriptors[key] = Object.getOwnPropertyDescriptor(source, key);
return descriptors;
}, {});
// é»è®¤æ
åµä¸ï¼Object.assign ä¹ä¼å¤å¶å¯æä¸¾ç Symbol 屿§
Object.getOwnPropertySymbols(source).forEach((sym) => {
const descriptor = Object.getOwnPropertyDescriptor(source, sym);
if (descriptor.enumerable) {
descriptors[sym] = descriptor;
}
});
Object.defineProperties(target, descriptors);
});
return target;
}
copy = completeAssign({}, obj);
console.log(copy);
// { foo:1, get bar() { return 2 } }
è§è æµè§å¨å
¼å®¹æ§ åè§
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4