繁体   English   中英

JS:遍历数组(对于…in)

[英]JS: Looping through array (for … in)

为什么在我这样做

http://jsfiddle.net/xe4Ph/1/

var footnoteLinks = [1,2,3];
for (var i in footnoteLinks) {
   document.write(footnoteLinks[i] + ", ");
}

我得到的是类似...

1,2,3,函数(){返回较低; },函数Array(){[native code]},函数pop(){[native code]},函数push(){[native code]},函数reverse(){[native code]},函数shift() {[本机代码]},函数sort(){[本机代码]},函数splice(){[本机代码]},函数unshift()

这是为什么? 函数的功能等等...我认为它可以正常运行b4,我不知道是什么原因造成的,对于我尝试过的所有浏览器来说似乎都是相同的。 Firefox 3.6,Chrome 6(我认为是),IE9

for(var in obj)用于迭代对象的属性。 您将获得已创建的Array对象的属性。

您需要更传统的循环/索引构造:

for(var i=0,z=footnoteLinks.length; i<z; i++)

一些JavaScript运行时在Array对象上也具有mapreduce方法,但这不能保证。 不过,大多数JavaScript库都具有类似的内容(或者可能是each方法)。

在javascript中,

for (var k in {a:1, b:2}) {

不只是遍历a和b; 它还会遍历该对象原型的所有成员。 由于函数是javascript中的值,因此包含了Object的所有方法。 有三种方法可以避免这种情况:

  1. 使用k之前检查obj.hasOwnProperty(k)
  2. 如果要遍历数组,请使用数组的forEach方法(或您喜欢的javascript库中的等效方法)
  3. 如果要遍历数组,请使用for(var i = 0; i <obj.length; i ++)构造(长度仅计算数组的元素)

for/in循环不能用于遍历数组,因为它还会枚举用户定义的属性(请参阅MDC文档 )。 在数组对象上和for each/in循环中for each/in forEach方法,但仅在JavaScript 1.6+中可用(=目前尚不可用)。 您可能要使用许多JavaScript框架中的一些,或者编写自己的实用程序函数来遍历数组:

function iterate(a, func) {
    for (var i=0; i<a.length; i++)
        func(a[i]);
}

iterate([1, 2], function(x) { console.log(x) });

克里斯·摩根Chris Morgan)建议,替代韦斯顿C的答案的方法是在for in循环中使用hasOwnProperty函数:

for(var i in obj) if(obj.hasOwnProperty(i)) {
  document.write(obj[i]);
}

是的,它比使用传统的for循环迭代要慢。

暂无
暂无

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

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