javascript - 为什么 __proto__ 周围的方括号使其在对象中可枚举
问题描述
在对象中使用方括号时__proto__
,__proto__
是可枚举的。当没有提供方括号时,__proto__
是不可枚举的。
例子:
obj = {"__proto__": "Hello"}
for (var k in obj)
{
console.log(k)
};
// No Output
使用方括号
obj = {["__proto__"]: "Hello"}
for (var k in obj)
{
console.log(k)
};
// Output:
// __proto__
我知道使用方括号计算属性名称,但我不明白为什么一个可以枚举而另一个不能。
解决方案
这在规范中有所描述。计算属性名称 of__proto__
被明确排除在检查之外,而允许isProtoSetter
正常字符串值 of :__proto__
- 如果 propKey 是 String 值
__proto__
并且 IsComputedPropertyKey(PropertyName) 是 false,那么
一种。让 isProtoSetter 为真。
- 别的,
一种。让 isProtoSetter 为假。
该isProtoSetter
标志为真时,表示创建的对象应该具有与该键配对的值的内部原型。对象的__proto__
标准内部原型是不可枚举的 - 它存在于Object.prototype
:
console.log(Object.getOwnPropertyDescriptor(Object.prototype, '__proto__'));
当为 false 时,它相当于拥有一个名为的普通属性__proto__
,并且对象初始值设定项中的普通属性变为可枚举的。
推荐阅读
- javascript - 为什么@chakra-ui/gatsby-plugin 会使 gatsby 崩溃?
- javascript - 更改滑块项目数(Owl Carousel v2)
- javascript - Fetch 不会返回任何结果
- javascript - 我可以在 PHP 中添加条件以仅在大屏幕上显示 JS 吗?
- kotlin - Kotlin for android - 第一个按钮有效,第二个无效?
- node.js - 如何将 Uint8Array 转换为 CanvasImageSource?
- java - 自定义链表中的垃圾回收
- python-3.x - 在python中右对齐循环文本
- c# - 如何使用 Xamarin Forms 在 C# 中以编程方式为 Picker 设置 ItemDisplayBinding?
- react-native - 在 React Native 中,如何将键盘位置置于所有其他元素之上?