将函数添加到javascript数组类中断循环

时间:2011-02-16 19:09:29

标签: javascript arrays for-in-loop

我一直在寻找一种方法来将最大/最小函数添加到JavaScript的Array类中,这似乎是一个已解决的问题:JavaScript: min & max Array values?。但是,当我尝试使用它时,我开始从我的代码中获取错误。事实证明,这种方法不适用于循环。

for(i in myArray) { console.log(i) } 

prints out


1
2
3
max
min

我可以使用另一种方法吗?

5 个答案:

答案 0 :(得分:10)

已接受的解决方案可以解决您的直接问题,但扩展核心对象通常是bad idea。如果您以后使用for..in包含库,会发生什么?或者当你几个月后忘记并在代码的不同部分使用错误的方法时?

另一个选择是包装和扩展。创建一个使用Array实例作为其原型的新类型:

function ArrayThing() {}

ArrayThing.prototype = new Array();

现在你有了一个可以延伸而不会影响Array的对象:

ArrayThing.prototype.max = function() {
    return Math.max.apply(null, [].slice.call(this, 0))
}

ArrayThing.prototype.min = function() {
    return Math.min.apply(null, [].slice.call(this, 0))
}

var list = new ArrayThing();

// standard array methods still work
list.push(5);
list.push(22);
list.push(0);
list.push(-14);
list.length // => 4

// as do your new custom methods
list.max() // => 22
list.min() // => -14

这不适用于所有情况,但除非你确定你真的需要Array,否则这是一个有用的选择。

答案 1 :(得分:6)

for...in循环用于循环对象的属性。如果要从数组中获取值,可以执行以下操作:

for (var i = 0; i < myArray.length; i++)
{
    console.log(myArray[i])
}

答案 2 :(得分:2)

for in是一个常见的Javascript陷阱。它不是像其他语言中的foreach那样表现,而是枚举给定对象中的所有属性。

由于Javascript Arrays碰巧有时会使用for in为每个索引创建一个属性,但正如您所见,它还会枚举您添加的任何其他属性。另一个问题是for in无法保证按任何特定顺序浏览属性,因此您的结果可能会因您使用的浏览器/运行时而异。

然后,使用无聊的for循环更安全。 Javascript中有许多for循环习语,所以我将列出一些:

常规循环:

for(i=0; i<arr.length; i++){

常规循环,缓存长度:

for(i=0, n=arr.length; i<n; i++){

循环对象/ NodeLists数组:

for(i=0; obj=arr[i]; i++){ //this works as long as the array has no falsy values
    foo(obj)

答案 3 :(得分:1)

您需要使用hasOwnProperty进行检查。 但是,这需要应用于循环的任何位置。

即:

for(i in myArray)
{
  if(arr.hasOwnProperty(i))
  {
   console.log(i);
  }
}

答案 4 :(得分:0)

现在有更现代的(IE9 +)方法:

var g = []; 

Object.defineProperty(g, "log", {
  enumerable: false,
  configurable: false,
  writable: false,
  value: function(){ console.log(this); }
});


g.push(5); 
g.push(9); 

var t;
for (t in g){
    console.log(g[t]);
}

打印5和9,但未列出“日志”功能

g.log() -> echos [5,9]

这项工作的关键是能够将属性标记为“enumerable:false”,并将属性标记为不应迭代的属性。

更多关于Object.defineProperty的信息: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty