使用For(... in Array)问题时的Mootools

时间:2011-08-12 01:44:23

标签: javascript mootools

这个问题已经存在了几年。

我正在为一个名为Discuz的论坛引擎编写一些插件,我为自己的项目使用了很多Mootools。当我将Mootools插入这个论坛引擎(discuz)时,事情变得疯狂......

去年我做了一些调试之后,我发现问题是Mootools原型很多核心元素,包括Array,而另一方面,这个论坛引擎使用了一个Forof(i in Array)循环为'阵列'。这肯定会导致问题,因为

for(i in [1,2,3,4,5]) console.log(i);  //0,1,2,3,4 the keys in this array 

**WITH MOOTOOLS
for(i in [1,2,3,4,5]) console.log(i);
//OUTPUT 0,1,2,3,4,$family,$constructor,pop,push,reverse,shift,sort,splice.......

上次我使用解析器更改所有for(i in array)循环以通过传递这些原型来添加'if item.hasOwnProperty()' 但我认为这是一个非常糟糕的解决方案,因为你知道,导致更多问题......新版本,错误代码......等等

我想知道是否有解决这个问题的工作?没有触及任何这个论坛引擎的js代码,还使用Mootools?

我知道使用For(.. in)for Array是不好的,但我的问题是我不想触摸这个论坛引擎的javascript代码,我只想要一个解决方案来过度加载问题

3 个答案:

答案 0 :(得分:2)

如上所述,您应该使用hasOwnProperty()。我不确定为什么你认为这会导致更多问题,实际上使用for(x in y)循环我默认会使用hasOwnProperty()并且只在特殊情况下省略它。

话虽如此,我不会在数组上使用for(x in y)循环。使用标准for(i=0; i<y.length; i++)循环通常会更好,这当然会忽略所有非数字属性。 (除非您知道自己有非连续的数组索引,否则for(x in y)将跳过未使用的索引,但即使在这种情况下,我仍可能使用标准for并测试对于循环中的undefined。)

更新:好的,我现在就知道了。如果您想继续使用MooTools,那么插入hasOwnProperty()的解决方案是我能想到的最佳解决方案。在)的结束for之后插入它应该合理地安全:您不需要检查现有的{}括号或添加您自己的{{1}}

答案 1 :(得分:0)

一些较新的浏览器support方法可以使所有这些额外的属性(系列,构造函数等)不可枚举,因此它们不会出现在for-in循环中。

但是,如果您希望能够支持旧浏览器,我认为您运气不佳:for-in是硬连线语法,因此您无法对其进行修补。 (无论如何,神奇的发现 - 替换似乎已经奏效......)

答案 2 :(得分:0)

Mootools扩展Array.prototype甚至Object.prototype,这可能会干扰for .. in循环,它会枚举所有属性,甚至是对象中存在的属性,因为它们在原型链上显示为向上。因此,在使用之前测试属性是否是对象的直接属性:

for(i in a)
    if (a.hasOwnProperty(i))
        console.log(i);