繁体   English   中英

Javascript-原型函数名称作为关联数组的键返回

[英]Javascript - Prototyped Function Name Returned As A Key Of Associative Array

我想将原型函数添加到javascript的数组对象中。

我遇到的问题是,当我步进数组的键时,原型函数的名称会出现在数组的键中。

这是说明问题的样本:

 <html> <head> <script type="text/javascript"> Array.prototype.foo = function () { // do something } function keys() { var fruit = ["apples","pears","bannanas"]; for (key in fruit) alert(key); // alerts: 0, 1, 2, foo } </script> </head> <body onload="keys();"> </body> </html> 

关于如何解决这个问题的任何想法?

没有为原型的功能,但是,从可读性点,我宁愿。

编辑:只是要清楚一点,上述示例的实际实现通过一个关联数组进行迭代,因此for..in循环

编辑:感谢您的答复家伙,但我认为您正在想念我。 我想知道的是,是否可以在通过for遍历数组的过程中,是否可以在JavaScript的数组对象中添加原型函数(或以可能具有相同效果的另一种方式声明该函数),而无需弄乱函数名称..在循环中。 indexOf函数为例。 Javascript似乎以一种内部定义的方式,使它不会出现在对象/数组的键中(对吗?)。 可以在运行时重现同样的行为吗?

您需要检查循环中是否有fruit.hasOwnProperty(key)

为了避免for..in继承继承的可枚举属性,请使用hasOwnProperty测试:

for (var p in obj) {
  if (obj.hasOwnProperty(p)) {
    // p is a property of obj and not inherited
  }
}

不建议将for..in与数组一起使用-如果需要对象,请使用对象。

通常在按顺序访问成员的地方使用数组,例如在循环中使用计数器。 在返回属性的顺序中使用for ..取决于实现,并且在浏览器之间也有所不同,因此您不能保证顺序。

正如詹姆斯所说,使用而不是...

function keys() {
  var fruit = ["apples", "pairs", "bananas"];
  for(var key in fruit) {
    alert(key);
  }
}

而是执行以下操作...

function keys() {
  var fruit = ["apples", "pairs", "bananas"];
  for(var i = 0; i < fruit.length; ++i) {
    alert(i);
  }
}

因为length属性将仅使用索引数组项更新,而不会添加到原型的项更新。

为了在for中迭代一个关联数组,并得到想要的结果,我将使用typeof进行类型检查,并限制为非函数。 您可以使用typeof http://msdn.microsoft.com/zh-cn/library/259s7zc1%28v=vs.94%29.aspx使用numberstringbooleanobject ,function和undefined

我很欣赏它并不总是可用,但是可以通过使用Array#forEach避免整个混乱,或者如果您使用的是JavaScript库(很可能并且强烈建议使用),那么您将拥有Prototype的Enumerable#each() ,Sugar的Array#each()或jQuery的$.each()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM