尝试并执行以下操作:
for (var key in String.prototype)
console.log(key);
它给你......什么都没有(好吧,除非你自己定义了一些外来的东西。)但是,你仍然有String.prototype.split
例如。我在其他所有本地对象(Number
,Array
,Object
)上尝试了相同的结果。
以下也“不起作用”:
for (var key in Array)
console.log(key);
虽然例如Array.isArray
。
Object.keys(Array.prototype)
给出一个空数组,Object.keys(Array)
也是如此。但是,Object.keys(jQuery)
例如提供了一个巨大的数组,正如预期的那样。
那么,为什么我们不能迭代浏览器提供的本机,但仍然可以访问它们?
答案 0 :(得分:3)
for...in
循环不会迭代内置属性
原因是Javascript中的属性是可枚举的或不可枚举的; “enumerable”表示您可以在for..in
循环中访问该属性。所有内置属性都是不可枚举的。
现代浏览器支持Object.getOwnPropertyNames
方法:
console.log(Object.getOwnPropertyNames(Array.prototype));
// ["length", "constructor", "concat", "map", "sort", "join", "indexOf", "filter", "some", "toString", "reduceRight", "splice", "forEach", "shift", "unshift", "toLocaleString", "lastIndexOf", "reverse", "reduce", "pop", "push", "every", "slice"]