繁体   English   中英

Javascript 中的 Object.assign 复制的属性中缺少原语

[英]Primitives missing from properties copied by Object.assign in Javascript

我有一个关于Object.assign()的问题。

 const v1 = 'abc'; const v2 = true; const v3 = 10; const v4 = Symbol('foo'); //Primitives will be wrapped to objects const obj = Object.assign({}, v1, null, v2, undefined, v3, v4); // Primitives will be wrapped, null and undefined will be ignored. // Note, only string wrappers can have own enumerable properties. console.log(obj); // { "0": "a", "1": "b", "2": "c" }

output 只是{ "0": "a", "1": "b", "2": "c" } 我猜这是"abc"被包装到 object 的结果。

评论说nullundefined被忽略,因此它们不在 output 中。

但是v2v3v4呢? 它们不存在于 output 中,所以我想知道如果包裹到对象中它们会变成什么。

你能解释一下为什么 output 中只有{ "0": "a", "1": "b", "2": "c" }吗? 我猜这是因为true10Symbol('foo')包装器没有自己的可枚举属性。 我在正确的轨道上吗?

谢谢。

是的,你的假设是正确的。 字符串具有可枚举属性,而布尔值、数字和符号则没有。 根据MDN

Object.assign() 方法仅将可枚举和拥有的属性从源 object 复制到目标 object。

但是 v2、v3 和 v4 呢? 它们不存在于 output 中,所以我想知道如果包裹到对象中它们会变成什么。

它们各自类型的实例, BooleanNumberSymbol

只有这些类型没有可以分配的可枚举属性,只有继承的方法。

看一下这个:

 var obj = {}; obj.test = 1; Object.defineProperty(obj, "foo", { enumerable: false, value: 13 }); console.log("obj.foo", obj.foo); console.log("assigned", Object.assign({}, obj)); // foo is not enumerable var obj2 = Object.create({ bar: 42 }); obj2.test = 2; console.log("obj2.bar", obj2.bar); console.log("assigned", Object.assign({}, obj2)); // bar is inherited, not own

这是一个基于 Thomas 片段的示例。

 //propertyIsEnumerable() var obj = {}; obj.test = 1; Object.defineProperty(obj, "foo", { enumerable: false, value: 13 }); console.log(obj.propertyIsEnumerable('foo')); //console.log("obj.foo", obj.foo); //console.log("assigned", Object.assign({}, obj)); // foo is not enumerable var obj2 = Object.create({ bar: 42 }); obj2.test = 2; //console.log("obj2.bar", obj2.bar); //console.log("assigned", Object.assign({}, obj2)); // bar is inherited, not own console.log(obj2.propertyIsEnumerable('bar'));

如您所见,属性 'foo' 和 'bar' 都不可枚举,因此它们都是 output false

正如 Thomas 所提到的,'foo' 是不可枚举的,因为描述符将其定义为enumerable: false ,并且 'bar' 不是 obj2 自己的属性,而是继承的,因此它也是不可枚举的。

Object.assign() 将所有可枚举自身属性的值从一个或多个源对象复制到目标 object。 例如:

 const sourceObject = { v1: 'abc', v2: true, v3: 10 }; const sourceObject2 = { b1: 'def', b2: false }; const obj = Object.assign(sourceObject, sourceObject2); console.log(obj);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM