停止JavaScript原型从杀死循环

停止JavaScript原型从杀死循环

问题描述:

我和他一起工作的几个人在他们的网站上包含一些我编写和主持的javascript。但是其中一些站点使用prototype.js或其他框架,并导致一些大问题。停止JavaScript原型从杀死循环

例如:

var test = {"one":[{"a":"b"}]}; 
for (var i in test.one) { console.log(i); } 

的这种预期的结果将是在控制台中的“0”(我是关键到阵列)

但是,如果我去一个像prototypejs网站。 org并在萤火虫的控制台中运行相同的代码,我得到所有原型垃圾(每个,每个Slice等)的列表。

尝试在您的控制台在此计算机上运行它,它会按预期返回“0”。

我该如何预防?有什么好的解决方法?

+0

大概重复http://*.com/questions/85992/how-do-i-enumerate-the-properties-of-来防止a-javascript-object – Dancrumb 2011-05-14 00:15:22

+1

你必须使用'for(i = 0; i Orbling 2011-05-14 00:16:03

+0

对不起,我发誓我首先搜索:) – nolanpro 2011-05-14 08:33:23

要么测试,每次枚举属性是原型

for (var i in test.one) { 
    if (test.one.hasOwnProperty(i)) { 
     console.log(i); 
    } 
} 

或不枚举阵列。

for (var i = 0, ii = test.one.length; i < ii; i++) { 
    console.log(i); 
} 

任何扩展Object.prototype的代码都不是你的问题。你不应该防范这一点。

+0

谢谢!我认为我必须使用hasOwnProperty()而不是for(i ... i ++),因为我在处理字符串键(又名对象属性,又名关联数组键),其中没有这样的属性“长度”。 – nolanpro 2011-05-14 08:32:44

你可以学习与他人没有在每次迭代检查hasOwnProperty很好地工作,不使用一个在循环,或者你可以在你开始爆炸的所有代码:

for(var p in Array.prototype)delete Array.prototype[p]; 

它将只会破坏非本土性质。

对Object和你想要的任何其他东西做同样的操作。

+0

+1用于清理原型!教导他们正确的腐败原生原型。 – Raynos 2011-05-14 04:08:44

Prototype.js东西Array.prototype与其他方法。

下面是prototype.js的摘录:

Object.extend(arrayProto, { 
    _each:  _each, 
    clear:  clear, 
    first:  first, 
    last:  last, 
    compact: compact, 
    flatten: flatten, 
    without: without, 
    reverse: reverse, 
    uniq:  uniq, 
    intersect: intersect, 
    clone:  clone, 
    toArray: clone, 
    size:  size, 
    inspect: inspect 
    }); 

你可以找到你的第一个for..in回路的输出所有这些属性。

可以通过不遍历与for..in阵列和代替使用var i; for (i = 0; i < arr.length; i++)