为什么“for-in”循环不遍历原型属性?

Ant*_*huk 5 javascript

让我们创建一个新对象:

var dict = {};
Run Code Online (Sandbox Code Playgroud)

已知的事实是,在创建一个新对象后,这个新对象继承了Object.prototype. 因此,当我尝试检查原型的属性是否被继承时"toString" in obj,我会得到true. 但是当我想将新创建的对象的所有属性放入一个数组中时,我会在填充完成后看到该数组为空。看看下面的代码:

var names = [];

for (var name in dict) {
  names.push(name);
}; 
names.length;
Run Code Online (Sandbox Code Playgroud)

不明白为什么会发生。

Far*_*ina 5

正如评论中许多人所说,For-In循环仅枚举原型链中的可枚举属性,继承的toString属性是不可枚举的。

如果您想迭代原型的不可枚举属性object以查看“ToString”是否存在,那么您应该获取对象原型并使用以下方法获取其可枚举和不可枚举属性getOwnPropertyNames:

var dict = {};
var objPrototype = Object.getPrototypeOf(dict);

var propertyNames = Object.getOwnPropertyNames(objPrototype);

propertyNames.length;
Run Code Online (Sandbox Code Playgroud)

  • 或者只是 `var names = Object.getOwnPropertyNames(objPrototype)` - 忘记OP的循环 - 它只会混淆问题。 (2认同)