[英]Javascript Renaming object properties in Object.assign() function
[英]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 的结果。
评论说null
和undefined
被忽略,因此它们不在 output 中。
但是v2
、 v3
和v4
呢? 它们不存在于 output 中,所以我想知道如果包裹到对象中它们会变成什么。
你能解释一下为什么 output 中只有{ "0": "a", "1": "b", "2": "c" }
吗? 我猜这是因为true
和10
和Symbol('foo')
包装器没有自己的可枚举属性。 我在正确的轨道上吗?
谢谢。
是的,你的假设是正确的。 字符串具有可枚举属性,而布尔值、数字和符号则没有。 根据MDN
:
Object.assign() 方法仅将可枚举和拥有的属性从源 object 复制到目标 object。
但是 v2、v3 和 v4 呢? 它们不存在于 output 中,所以我想知道如果包裹到对象中它们会变成什么。
它们各自类型的实例, Boolean
, Number
和Symbol
。
只有这些类型没有可以分配的可枚举属性,只有继承的方法。
看一下这个:
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.