【问题标题】:What happens when I `Object.assign` to a primitive type in javascript?当我将 Object.assign 分配给 javascript 中的原始类型时会发生什么?
【发布时间】:2017-03-02 16:18:26
【问题描述】:

我发现您可以在 javascript 中调用 stringnumber 类型的 Object.assign 以获得一种“增强”原始类型。

// closure used to create object for simplicity
function makeObj() {

    let value = 6;

    let enhancedValue = Object.assign(value, {
        set: () => 'from the set method'
    })

    return {
        someValue: enhancedValue
    };
}

let myObj = makeObj();

// output is from nodejs

console.log(myObj.someValue); // accessing
// outputs: `{ [Number: 6] set: [Function: set] }`
console.log(myObj.someValue + 3); // using
// outputs: `9`
console.log(myObj.someValue.set()) // using method
// outputs: `from the set method`

所以我的问题是:现在这是什么类型的?有没有定义这种行为的规范?有什么理由不这样做吗?你能解释一下这里发生了什么吗?

【问题讨论】:

  • 所有原始类型都可以“装箱”成对象。有Number原型、String原型等。
  • 基本上是一个带有额外属性的 new Number(6) 对象

标签: javascript


【解决方案1】:

在 JavaScript 中,几乎所有原始类型都有一个等价的对象类型。因此,"x" 是一个字符串原语,new String("x") 是一个字符串对象。同样,还有数字原语和Number对象,布尔原语和Boolean对象等。

Object.assign 的第一步是获取第一个参数并在其上使用abstract ToObject operation,它执行原始到对象的步骤。从那时起,它使用 ToObject 返回的对象。 (如果 ToObject 已经是一个对象,它只会返回它的参数。)

该对象是 assign 最终返回的对象。

【讨论】:

  • @T.J.Crowder,谢谢你的回答,它解释了很多!我的最后一个问题是:有什么理由不向字符串/数字/等添加方法吗?这是不好的做法吗?
  • @Bergi:哎呀,我的头在别处,出于某种原因在考虑 ES5。我本来打算回去解释一下区别,但无论如何它是切线的,所以我把它删除了。
  • @RicoKahler:你会发现两种思想流派,都有忠实的、直言不讳的、理性的追随者:“不!没有理由,去吧,毕竟这就是原始人的意义。当心命名冲突。”和“是的,有;你将不可避免地与其他人做同样的事情发生冲突。即使你不与另一个做扩展的脚本发生冲突,你很可能最终会与未来的标准发生命名冲突。”两个阵营至少可以就一件事达成一致:永远不要将可枚举属性添加到内置原型中。 :-)
  • @RicoKahler:是的。如果你这样做,我建议使用Object.defineProperty(仅用于一个)或Object.defineProperties(用于多个)。 enumerable 标志(与属性描述符中的所有标志一样)的默认值是 false
  • @RicoKahler 不,T.J. Crowder 只谈论所有原语的原生原型(如Number.prototype)。如果您要创建自己的对象实例,您可以随心所欲地使用它们(包括可枚举的属性)。虽然盒装原语很奇怪,但通常建议不要使用它们 - 而是创建一个代表您需要的适当类。
猜你喜欢
  • 2014-08-02
  • 1970-01-01
  • 2017-09-15
  • 1970-01-01
  • 1970-01-01
  • 2018-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多