[英]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使用number
, string
, boolean
, object
,function和undefined
。
我很欣赏它并不总是可用,但是可以通过使用Array#forEach
避免整个混乱,或者如果您使用的是JavaScript库(很可能并且强烈建议使用),那么您将拥有Prototype的Enumerable#each()
,Sugar的Array#each()
或jQuery的$.each()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.