我正在研究 Javascript 中的原型(prototype)设计,并且在实验中试图尽可能多地剥离其信息的一些基本对象。但是,我在以下代码段中遇到了问题:

let x = [];
Object.setPrototypeOf(x, null);
console.log(Object.prototype.toString.call(x));
>>> [object Array]
我的困惑是:移除原型(prototype)后,Object.prototype.toString 怎么还知道 xArray 类型?如果不是任何属性,这些信息来自哪里?运行 Object.getOwnPropertyNames(x)Object.getOwnPropertySymbols(x) ,我没有在 x 上看到任何包含字符串 Array 路径的属性。这些信息存储在哪里?
如果这是那些“内部插槽”之一(虽然我不确定它会是哪个),有没有办法修改它?我至少可以直接访问它吗?
更新:
Yousaf 注意到属性 String.toStringTag 通常由 Object.prototype.toString 访问,以提供代替上述示例中的“Array”的字符串。实际上,设置 x[Symbol.toStringTag] = 'my_string' 允许我们更改 .toString() 值。但是,我认为它仍然没有解开这个谜,因为在我们设置之前 x[Symbol.toStringTag]undefined,不包含所需的“数组”字符串。

最佳答案

当在任何对象上调用 .toString() 时,它​​会创建一个形式为 [object x] 的字符串,其中 x 是构造函数的名称,以防内置构造函数(如 DateArray )。
.toString() 被调用时,有几个步骤,其中一个步骤是检查 this.toString() 的值是否是一个数组。如果是数组,则 tag 设置为字符串 'Array'
Spec - 19.1.3.6 Object.prototype.toString ( ) :

在 ES6 之前,当在用户定义的构造函数的实例上调用 .toString() 时,会记录 [object Object]。 ES6 提供了一种使用众所周知的 Symbol Symbol.toStringTag 来覆盖标签的方法。

关于javascript - javascript 是否存储超出原型(prototype)的数据类型信息?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/63591582/

10-11 00:57
查看更多