由于我在这里发布的问题Mootools when using For(...in Array) problem关于一些javascript框架将原型化Array对象,而其他一些代码(一个论坛引擎)确实使用For ... in循环来循环数组,当我插入javascript框架进入这些现有代码,事情就会出错。
//BEFORE
for(key in [1,2,3,4]) console.log(key) //0,1,2,3 keys of the array
//After JS Framework
for(key in [1,2,3,4]) console.log(key) //0,1,2,3,$family,$constructor,pop,push,reverse,shift,sort,splice
鉴于我无法触及包含这些For..In Array循环的原始代码,我也想使用javascript框架(mootools)
我可以解决这个问题吗?原型javascript迭代器??
以某种方式重载For ... In循环,使我的所有javascript For ... in循环扫描数组类型并只返回值而不是函数?我不知道怎么做但我想知道这是否可以做到?
答案 0 :(得分:2)
原始代码被破坏了......真是太遗憾了。
使用Mozilla JavaScript - 不要将Mozilla JavaScript扩展与ECMAScript 混淆 - 可以为对象定义自定义Iterator。见What's new in JavaScript 1.7。但是,在这种情况下,这可能不实用。
我的建议是:
hasOwnProperty
进行密钥迭代,或者; i < arr.length
用于数组索引迭代。快乐的编码。
答案 1 :(得分:1)
不要在数组上使用for (key in array)
逻辑。它用于迭代对象属性,而不是迭代数组。如您所见,当您在数组上使用它时,您将获得该数组的所有属性,包括已添加的非本机属性/方法。
您应该使用这种类型的for循环迭代数组:
for (var i = 0; i < array.length; i++) {
item = array[i];
}
是的,我们不能在数组上使用更短的语法,这似乎是一件令人失望的事情,但这就是语言的方式。
可以尝试使用以下方法解决此问题:
for (key in array) {
if (array.hasOwnProperty(key)) {
// operate on array[key] here
}
}
但是,我不推荐它。使用用于数组的迭代器只是更安全。
答案 2 :(得分:1)
将数组存储在变量中,然后像这样迭代它:
var items = [1,2,3,4];
for(var i = 0; i < items.length; i++) {
console.log(i);
}
答案 3 :(得分:0)
可以使用“删除”轻松删除原型函数,但框架往往依赖于它们,所以这不是一个好主意。
delete Array.prototype.$family;
delete Array.prototype.$constructor;
delete Array.prototype.pop;
delete Array.prototype.push;
...
糟糕的是手头没有简单的选择。你可以: