1

似乎它正在重新发明本地提供的轮子,不是吗?真的值得额外的框架重量吗?为什么这些框架觉得有必要将其定义为附加功能,而for...in似乎可以很好地满足该功能的目的?

4

4 回答 4

4

有一些很好的理由可以避免使用for..in迭代数组。

$.each并在 Javascript 1.6_.each中引入之前。Array.forEach

于 2012-09-05T06:39:45.350 回答
3

例如,如果您执行以下操作:

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); });
});

然后它工作正常,因为当你在函数中传递一个变量时,上下文就会丢失。

于 2012-09-05T06:37:06.973 回答
1

for ... in还捕获原型链中的属性。您必须使用该.hasOwnProperty()方法来过滤掉事物。

于 2012-09-05T06:43:41.383 回答
0

继承问题

可以解决:

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://sugarjs.com/native

http://javascript.info/tutorial/native-prototypes

http://javascript.info/tutorial/inheritance

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/hasOwnProperty#Example:_Itarate_over_properties_not_considering_inherited_properties

我真的希望有人javascript.info能帮他维护他的英文版教程,因为它真的很棒。


for...in 的另一个问题

...是你理论上不能保证迭代顺序。如果你在处理一个数组,它不一定是索引的升序甚至降序。规范留给供应商来决定。在实践中,我读到它或多或少是统一的和可预测的,但这并不能保证就是全部。

于 2012-09-06T08:37:13.507 回答