今天有个奇怪的虫子出现了。在我们的应用程序中,在一个文件上,所有的对象都附加了一个函数,就好像它们是原型一样。我们没有对我们的数组进行原型化,但是我在其他方面做过工作,其中数组和对象都有原型,当您执行for(在该循环中)时,原型将作为项包含在其中,我们必须对它们进行过滤。因此,有两个部分的问题:
我们认为我们拥有的jquery插件之一是邪恶的。
发布于 2012-09-06 17:47:59
我认为“索引计数”指的是length属性。在这种情况下,你的第一个问题的答案是“否”。length属性与数组的最高数值索引相关联。因此,例如,如果您有以下代码,arr.length将是4
var arr = [];
arr[3] = true;
arr.length; //is 4但是,您提到了for-in循环,它在这种情况下具有奇怪的行为。如果我们在arr上执行for-in (从上面),我们将得到以下内容:
var output = "";
for (i in arr) { //Don't do this!
output += i;
}
output; //is "3" (not "0123" as you might expect)正如我所提到的,原型属性对长度没有影响:
Array.prototype.foo = true;
var arr = [];
arr[3] = true;
arr.length; //is 4但是,它们确实会影响for-in循环(在正常情况下):
var output = "";
for (i in arr) { //arr from the previous code block.
output += i;
}
output; //is "3foo" (or maybe "foo3", there's no guarantee form the spec either way)有几种方法可以绕过这件事。首先,由于这种无稽之谈,不应该在数组对象上使用for-in。但是,如果出于某种原因必须这样做,则应该始终使用hasOwnProperty()筛选器保护for-in循环,如下所示:
var output = "";
for (i in arr) { //arr from the previous code block
if (arr.hasOwnProperty(i)) {
output += i;
}
}
output; //is "3"再说一次,我们不能保证订购。因此,如果arr是[1,1,1],您可能会得到output作为"201" (尽管这不太可能)。
另一种选择是尝试通过使用ES5的一个特性(如果存在)来保护您在对象级别上的原型属性,将它们设置为不可枚举,从而避免别人编写不好的代码。你会这样做的:
var foo = (function() { /* do something */ });
if(typeof Object.defineProperty === "function") { //If ES5
Object.defineProperty(Array.prototype, "foo", {
value: foo,
enumerable: false //make it not enumerable
});
} else { //For older browsers
Array.prototype.foo = foo;
}
var arr = [], output = "";
arr[3] = true;
for(i in arr) { //Seriously, don't do this.
output += i;
}
output; //is "3"我要强调的是,在数组上执行输入是一个的坏主意,。事实上,在几乎所有的情况下,我都倾向于避免进入,因为你永远不知道外面的人是否想成为一个混蛋,并将其抛到代码的中间:
Object.prototype.ponies = "Ponies!";发布于 2012-09-06 17:28:08
尽管数组是对象,因此可以有数量的属性,但只有整数属性才能计算到array本身。
var a = [];
alert(a.length); // 0
a.foo = "Ha";
alert(a.length); // 0
a[1] = 10;
alert(a.length); // 1
Array.prototype.shuffle = function() { ... }
alert(a.length); // 1虽然不建议使用for ... in来处理数组,但仍有一些人这样做。for ... in会同时找到foo和shuffle。
发布于 2012-09-06 17:32:34
如果您避免使用for (var i in array)来迭代您的数组,并且只通过从0到array.length - 1的数字索引来迭代它们,那么如果有人向数组原型添加了什么东西,就不会有问题。这就是为什么您应该避免使用for/in技术来迭代数组。
无论向数组或数组原型添加了多少属性或方法,都有一些迭代数组的安全方法:
for (var i = 0, len = array.length; i < len; i++) {
// access array[i] here
}
var i = 0, len = array.length;
while (i < len) {
// access array[i] here
i++;
}https://stackoverflow.com/questions/12305282
复制相似问题