鉴于 for..在构造中,库提供的函数(如 jQuery.map() 或 _.each())有什么用

Given the for...in construct, what is the use of library-provided functions like jQuery.map() or _.each()?

本文关键字:map jQuery 什么 each 函数 for 鉴于      更新时间:2023-09-26

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

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

$.each_.each在Javascript 1.6中引入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://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家伙维护他的教程的英文版本,因为它真的太棒了。


另一个问题...在

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