当我对Object.assign()使用原语时,结果显示为空对象

时间:2019-04-05 10:09:35

标签: javascript

我不理解示例中的“原语将被包装到对象中”部分。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign#Primitives_will_be_wrapped_to_objects

该示例显示了原始元素将被包装,但是结果是一个空对象。

var v1 = true;
var v2 = 10;
var v3 = Symbol('foo');

console.log(Object.assign({}, v1, v2, v3)); //ouput: {}

结果是因为原语像null和undefined一样被忽略吗?

这个例子是什么意思?

1 个答案:

答案 0 :(得分:10)

是的,第一个参数之后的每个参数都将被转换to an object,但是默认情况下,基元没有任何可枚举的自有属性:

  
      
  1. 让我们成为ToObject(nextSource)。
  2.   
  3. 让密钥来自。[OwnPropertyKeys]。
  4.   
  5. (遍历键,将其分配给第一个参数对象)
  6.   

(您可以在某些原语上访问的属性位于原型上,并且不具有自己的键(例如toFixed)或不可枚举的属性(例如length),因此不会包含它们)

因此,结果对象没有键值对,因为布尔值,字符串和符号都没有任何可枚举的自身属性。

如果您显式使用new <primitiveType>并将属性分配给所包装的对象,则在结果中看到该属性:

var v1 = new Boolean(true); // please don't ever do this in real code
v1.foo = 'foo';
var v2 = 10;
var v3 = Symbol('foo');

console.log(Object.assign({}, v1, v2, v3));