gpt4 book ai didi

javascript - 在 JavaScript 中使用 "new"关键字创建包装的 BigInt 或 Symbol 有区别吗?

转载 作者:行者123 更新时间:2023-12-04 09:45:15 25 4
gpt4 key购买 nike

我已经使用以下代码检查了包装的符号对象。

const symObj = Object(sym);
const symObjNew = new Object(sym);
// I can see no difference between symObj and symObjNew

console.log(`typeof symObj === 'object' is ${typeof symObj === 'object'}`); // true
console.log(`typeof symObjNew === 'object' is ${typeof symObjNew === 'object'}`); // true

我还检查了 symObjsymObjNew在开发工具中使用 node --inspect-brk .我看不出它们之间有什么区别。 BigInt 也是如此。

最佳答案

TL;博士
new Object(realthing) 之间没有区别和 Object(realthing) .他们做同样的事情。

更长的答案

对于 JS,阅读规范总是一个好主意,尽管很难弄清楚其中的含义。所以,让我们深入研究一下:在这种情况下,我们想要 the rules for how Object() works :

19.1.1The Object Constructor

The Object constructor:

  • is the intrinsic object %Object%.
  • is the initial value of the Object property of the global object.
  • creates a new ordinary object when called as a constructor.
  • performs a type conversion when called as a function rather than as a constructor.
  • is designed to be subclassable. It may be used as the value of an extends clause of a class definition.


所以我们有两个案例要看: Object(sym) , 和 new Object(sym) .
Object(sym) 会发生什么?

19.1.1.1 Object([ value ])

When the Object function is called with optional argument value, the following steps are taken:

  1. If NewTarget is neither undefined nor the active function, then Return ? OrdinaryCreateFromConstructor(NewTarget, "%ObjectPrototype%").
  2. If value is null, undefined or not supplied, return ObjectCreate(%ObjectPrototype%).
  3. Return ! ToObject(value).


(注意 ?! 这里不是“代码”,它们是规范语法。 ! 表示“此操作将始终返回 a normal value? 可能返回异常值)

在这种情况下,我们没有使用 new ,所以步骤 1 不适用。该值不是空值,因此第 2 步不适用,我们最终执行第 3 步:我们执行类型转换,因此我们最终得到一个新对象, typeof现在会说 "object" ,不管以前是什么,但将原始数据保留为值。
new Object(sym) 会发生什么?

再次查看 19.1.1.1,我们正在使用 new这一次,所以我们可能期望第 1 步开始:毕竟,有一个 NewTarget (根据定义:我们使用了 new 所以有一个 NewTarget ),但结果是 NewTargetObject函数本身,使 NewTarget事件功能,因此步骤 1a 不会启动。

我们还有一个值,它不是空值,所以第 2 步没有启动,我们再次运行第 3 步:类型转换。

所以 Object(sym)new Object(sym)做完全相同的事情,只是出于微妙的不同原因。

那么 ToObject 是如何工作的呢?

再次查看规范:

7.1.13ToObject ( argument )

The abstract operation ToObject converts argument to a value of type Object according to Table 12:

  • Undefined Throw a TypeError exception.
  • Null Throw a TypeError exception.
  • Boolean Return a new Boolean object whose [[BooleanData]] internal slot is set to argument. See 19.3 for a description of Boolean objects.
  • Number Return a new Number object whose [[NumberData]] internal slot is set to argument. See 20.1 for a description of Number objects.
  • String Return a new String object whose [[StringData]] internal slot is set to argument. See 21.1 for a description of String objects.
  • Symbol Return a new Symbol object whose [[SymbolData]] internal slot is set to argument. See 19.4 for a description of Symbol objects.
  • Object Return argument.


所以第一个观察应该是“如果它是一个对象,ToObject 什么都不做”。你的 Object(sym) 当然不是这样。 ,那么它会发生什么?

一个新对象被构建,它的 type设置为 object (不管输入值的类型是什么),并且这个新对象的原型(prototype)将被设置为匹配输入值的原型(prototype)。然后新对象的内部值从被转换的输入值中复制过来。

但我们还没有完成
typeof对于测试“事物是什么”毫无用处。

请记住,几乎 JS 中的所有内容都是对象,而 typeof只会告诉你 the basic type of something .因此,它只能给你六个答案:
  • 对象
  • 功能
  • 字符串
  • 符号
  • 号码
  • 未定义

  • 就是这样。 typeof运算符不会告诉您最具体的类型是什么,而是告诉您最通用的类​​型是什么。

    对于特定类型,请使用 thing.constructor.name找出实际用于构建您正在检查的东西的构造函数,或使用 thing.__proto__获取对该类型的引用。或者,如果您已经拥有该类型,并且只需要测试“事物是否为 ...”,请使用 instanceof运算符(operator):
    > typeof 3
    "number"

    > typeof Object(3)
    "object"

    > Object(3).constructor.name
    "Number"

    > Object(3).__proto__
    Number { 0 }

    > Object(3) instanceof Number
    true

    关于javascript - 在 JavaScript 中使用 "new"关键字创建包装的 BigInt 或 Symbol 有区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62155111/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com