似乎它正在重新发明本地提供的轮子,不是吗?真的值得额外的框架重量吗?为什么这些框架觉得有必要将其定义为附加功能,而for...in
似乎可以很好地满足该功能的目的?
4 回答
有一些很好的理由可以避免使用for..in
迭代数组。
$.each
并在 Javascript 1.6_.each
中引入之前。Array.forEach
例如,如果您执行以下操作:
for (var i = 0; i < 5; i += 1) {
document.getElementById('el' + i).onclick = function () {
alert(i);
};
}
然后,如果您单击将获得的每个元素,5
因为它会捕获上下文,并且i
变量在每种情况下都是相同的。
可以这样修复:
for (var i = 0; i < 5; i += 1) {
(function (i) {
document.getElementById('el' + i).onclick = function () {
alert(i);
};
})(i);
}
但有了each
它会更好,所以当你这样做时(不是很好的例子,只是为了演示):
$('.el').each(function (i) {
$(this).click(function () { alert(i); });
});
然后它工作正常,因为当你在函数中传递一个变量时,上下文就会丢失。
for ... in
还捕获原型链中的属性。您必须使用该.hasOwnProperty()
方法来过滤掉事物。
继承问题
可以解决:
for (key in obj) {
if(obj.hasOwnProprty(key)) continue;
console.log("Property "+key+" has value "+obj[key].toString());
}
我见过一些关于管子的使用:
if (Object.prototype.hasOwnProperty(key)) continue;
...对于hasOwnProperty
过滤器,但我认为它本质上并不安全,如果您在hasOwnProperty
页面上包含修改对象属性的代码,那么 IDK 无论如何要告诉您什么,除了代码就在那里^^ 如果你想要它,并找到一个新的库开始使用。我的意思是,如果有人可以修改您对象的hasOwnProperty
属性,那么还有什么可以阻止他们修改Object.prototype.hasOwnProperty
呢?
无论如何,继承财产问题的一些相关链接:
http://javascript.info/tutorial/native-prototypes
http://javascript.info/tutorial/inheritance
我真的希望有人javascript.info
能帮他维护他的英文版教程,因为它真的很棒。
for...in 的另一个问题
...是你理论上不能保证迭代顺序。如果你在处理一个数组,它不一定是索引的升序甚至降序。规范留给供应商来决定。在实践中,我读到它或多或少是统一的和可预测的,但这并不能保证就是全部。