停止JavaScript原型从杀死循环
我和他一起工作的几个人在他们的网站上包含一些我编写和主持的javascript。但是其中一些站点使用prototype.js或其他框架,并导致一些大问题。停止JavaScript原型从杀死循环
例如:
var test = {"one":[{"a":"b"}]};
for (var i in test.one) { console.log(i); }
的这种预期的结果将是在控制台中的“0”(我是关键到阵列)
但是,如果我去一个像prototypejs网站。 org并在萤火虫的控制台中运行相同的代码,我得到所有原型垃圾(每个,每个Slice等)的列表。
尝试在您的控制台在此计算机上运行它,它会按预期返回“0”。
我该如何预防?有什么好的解决方法?
要么测试,每次枚举属性是不原型
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
的代码都不是你的问题。你不应该防范这一点。
谢谢!我认为我必须使用hasOwnProperty()而不是for(i ... i ++),因为我在处理字符串键(又名对象属性,又名关联数组键),其中没有这样的属性“长度”。 – nolanpro 2011-05-14 08:32:44
你可以学习与他人没有在每次迭代检查hasOwnProperty很好地工作,不使用一个在循环,或者你可以在你开始爆炸的所有代码:
for(var p in Array.prototype)delete Array.prototype[p];
它将只会破坏非本土性质。
对Object和你想要的任何其他东西做同样的操作。
+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++)
大概重复http://*.com/questions/85992/how-do-i-enumerate-the-properties-of-来防止a-javascript-object – Dancrumb 2011-05-14 00:15:22
你必须使用'for(i = 0; i
Orbling
2011-05-14 00:16:03
对不起,我发誓我首先搜索:) – nolanpro 2011-05-14 08:33:23