我被告知不要使用。。。在JavaScript中使用数组。为什么不呢?


当前回答

for in循环在遍历数组时将索引转换为字符串。例如,在下面的代码中,在用i+1初始化j的第二个循环中,i是索引,但在字符串(“0”、“1”等)中,js中的number+string是字符串。如果js遇到“0”+1,则返回“01”。

var maxProfit=函数(价格){设maxProfit=0;for(让我输入价格){for(设j=i+1;j<prices.length;j++){console.log(价格[j]-价格[i],“i,j”,i,j,类型i,类型j);如果((prices[j]-prices[i])>maxProfit)maxProfit=(prices[j]-prices[i]);}}return maxProfit;};最大利润([7,1,5,3,6,4]);

其他回答

孤立地说,在数组中使用for没有错。For-in迭代对象的属性名,在“现成”数组的情况下,财产对应于数组索引。(像length、toString等内置属性不包含在迭代中。)

然而,如果您的代码(或您正在使用的框架)将自定义财产添加到数组或数组原型中,那么这些财产将包含在迭代中,这可能不是您想要的。

一些JS框架,如Prototype修改了Array原型。像JQuery这样的其他框架则不然,因此使用JQuery,您可以在中安全地使用。

如果你有疑问,你可能不应该使用。

迭代数组的另一种方法是使用for循环:

for (var ix=0;ix<arr.length;ix++) alert(ix);

然而,这有一个不同的问题。问题是JavaScript数组可能有“洞”。如果您将arr定义为:

var arr = ["hello"];
arr[100] = "goodbye";

然后数组有两个项目,但长度为101。在中使用for将产生两个索引,而for循环将产生101个索引,其中99的值为undefined。

的问题。。。在…-只有当程序员不真正理解语言时,这才成为问题;它实际上不是一个bug或任何东西,而是它迭代对象的所有成员(好吧,所有可枚举成员,但这只是一个细节)。当您只想迭代数组的索引财产时,确保语义一致的唯一方法是使用整数索引(即for(vari=0;i<array.length;++i)样式循环)。

任何对象都可以有与之关联的任意财产。特别是将附加财产加载到数组实例上并没有什么可怕的。如果代码只想看到索引的类似数组的财产,则必须坚持使用整数索引。完全了解用于…的代码。。。在does和really需要查看所有财产,那么这也没关系。

由于JavaScript元素保存为标准对象财产不建议使用for…遍历JavaScript数组。。。在里面循环,因为普通元素和所有可枚举的财产上市的

从…起https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Indexed_collections

这不一定是坏的(根据您正在做的事情),但在数组的情况下,如果在Array.prototype中添加了一些东西,那么您将得到奇怪的结果。您希望此循环运行三次:

var arr = ['a','b','c'];
for (var key in arr) { ... }

如果一个名为helpfulUtilityMethod的函数被添加到Array的原型中,那么循环将运行四次:键将是0、1、2和helpfulUtilityMethod。如果你只需要整数,噢。

主要有两个原因:

One

就像其他人所说的那样,您可能会得到不在数组中或从原型继承的密钥。因此,假设库向Array或Object原型添加了一个属性:

Array.prototype.someProperty = true

您可以将其作为每个阵列的一部分:

for(var item in [1,2,3]){
  console.log(item) // will log 1,2,3 but also "someProperty"
}

可以使用hasOwnProperty方法解决此问题:

var ary = [1,2,3];
for(var item in ary){
   if(ary.hasOwnProperty(item)){
      console.log(item) // will log only 1,2,3
   }
}

但这对于使用for in循环迭代任何对象都是正确的。

Two

通常,数组中项目的顺序很重要,但for in循环不一定以正确的顺序迭代,这是因为它将数组视为对象,这是在JS中实现的方式,而不是数组。这看起来是一件小事,但它确实会破坏应用程序,而且很难调试。