我是Prototype的新手,但我总是使用jQuery。我有一个网站,我需要使用jQuery和Prototype。我遇到以下代码问题:
var x = [];
console.log(x);
for (var l in x)
{
console.log(l);
}
运行此代码,x包含以下内容:
each eachSlice all any collect detect findAll select grep include member inGroupsOf inject invoke max min partition pluck reject sortBy toArray entries zip size inspect find _reverse _each clear first last compact flatten without uniq intersect clone
预期结果(没有原型):
There are no child objects
为什么Prototype会这样做,以及如何阻止它?!
由于
答案 0 :(得分:7)
您不应该对数组使用for...in
,这正是原因。
for...in
遍历对象的所有属性。这包括其属性(在本例中为数组索引)和添加到prototype
的属性。
对于数组,只需使用普通的for
循环。
var x = [];
console.log(x);
for(var i = 0, len = x.length; i<len; i++){
console.log(i, x[i]);
}
注意:我执行var i = 0, len = x.length
因为它只从数组中获取length
一次,而不是每次迭代。 可能更快。
答案 1 :(得分:5)
您不应在数组上使用for..in
,而应使用for( i=0; i<length; i++)
。但除此之外:
for( l in x) {
if( x.hasOwnProperty(l)) {
// l is a property of your object
}
}
这基本上忽略了循环的原型链。
答案 2 :(得分:0)
当您使用for ... in
时,您将枚举数组的所有(可枚举的)属性,而不仅仅是数字索引。
由于Prototype.js向Array.prototype
添加了许多新函数,并且未能将它们标记为不可枚举,因此这些函数也会出现在属性列表中。