for(var i in array)VS for(i = 0; i

时间:2011-04-01 08:22:09

标签: javascript for-loop

我只想问一下 in_array_orig in_array_new 是否相同。 当比较两个数组( aArr1 vs aArr2 )时,我也对结果感到困惑。

有人能解释我吗?感谢

这是我的示例测试代码

function echo(s)
{
    document.write(s);
}

function in_array_orig(oItem, aArray)
{   
    for (var i=0; i<aArray.length; i++) if (aArray[i] == oItem) return true;

    return false;
}

function in_array_new(oItem, aArray)
{
    for (var i in aArray) if (aArray[i] == oItem) return true;

    return false;
}

var a = ['gab', '24', 'manila'];

var aArr1 = [1];
var b = {0:aArr1, 1:24, 2:'manila'};

var aArr2 = [1];


echo(in_array_orig(24, a)); // true
echo(in_array_new(24, b)); // true

echo(in_array_orig(aArr2, b)); // false
echo(in_array_new(aArr2, b)); // false

echo ((aArr1==aArr2)); // false
echo ((aArr1===aArr2)); // false

提前致谢

6 个答案:

答案 0 :(得分:6)

如果属性在对象中,则in运算符返回true。这包括在原型链中查找。例如:

Object.prototype.k = 5;
f = {};
'k' in f; // true

即使f是一个空对象,它的原型(因为JS中的所有类型)都包含Object的原型,其属性为'k'

虽然您没有询问,此处仅检查对象自身属性的有用函数是.hasOwnProperty(),因此在上面的示例中:

f.hasOwnProperty('k'); // false, that's more what we would expect

虽然对于数组,您(通常)不想迭代所有属性,因为这些属性可能包含索引值以外的其他内容,因此,出于性能和预期行为的原因,常规for(var i=0;i<n;i++)应该是使用

因此,如果您正在使用数组,请使用in_array_orig,对于您对其属性感兴趣的对象,请使用in_array_new(应适当重命名,in_obj或东西)。

此外,[1] == [1]返回false,因为两个对象/数组不是相同的对象。实际上,它们的每个属性和索引都具有相同的值,尽管它们并不位于内存中的相同位置,因此不被认为是相同的。您可以轻松构建(or find on the net)深度搜索equals()例程,以检查两个对象/数组是否确实等于(而不是地址)。

答案 1 :(得分:0)

我想这已经在SO中讨论过了。

在此处查看

答案 2 :(得分:0)

in_array_orig仅适用于数组,in_array_new也适用于字典。对于数组,它们的结果将是相同的,但不能保证在in_array_new中以正确的顺序处理项目(如果此函数无关紧要)。

关于数组比较,似乎JavaScript不会逐个元素地比较数组,而是比较数组是否是内存中的同一个对象,例如:

aArr1 == aArr1 // true

答案 3 :(得分:0)

是的,两者之间存在差异。

首先,语法for(var i=0; i<aArray.length; i++)显然只适用于只有数字键的数组,并且键序列中没有任何间隙。如果这不适用于您的数据,那么这种语法显然会给您带来问题。

但真正的区别在于Javascript如何处理数组和对象。

使用for(x in y)会导致JS遍历对象中的所有属性和方法。

在JS中,数组只是一种对象,带有一些预定义的方法和属性,例如length来查找数字数组元素,pop()push()添加和删除元素等

如果在数组上使用for(x in y)语法,它将在循环中包含其中一些方法和属性。这不太可能是你的意图,可能会产生一些奇怪的副作用。

因此,如果您想使用for(x in y),最好先使用对象而不是数组

我希望有所帮助。

答案 4 :(得分:0)

关于第一个问题,请参阅http://www.openjs.com/articles/for_loop.php

关于第二个:

echo(in_array_orig(24, a)); // true
echo(in_array_new(24, b)); // true

我认为这不会对你造成任何问题。

echo(in_array_orig(aArr2, b));
echo(in_array_new(aArr2, b));

这两个肯定都是假的,因为他们不在b里面。如果你对b做了一个小改动:

var b = {0:aArr1, 1:24, 2:'manila', 3:[1]};

然后试试这个:

console.log(in_array_new(aArr2, b[3]));
console.log(in_array_orig(aArr2, b[3]));

他们现在都是 True

最后,最后一次:

echo ((aArr1==aArr2));

“==”运算符比较它们的值,所以这是假的,因为它们显然具有不同的内容,意味着价值。

echo ((aArr1===aArr2));

“===”比较它们的值和类型,它们的值不同但它们的类型相同,您可以通过以下方式检查:

console.log(typeof aArr1===typeof aArr2);

因此它仍然是错误

答案 5 :(得分:-1)

  

如果in_array_orig和in_array_new是相同的

是的,他们是。 (同样的行为)

  当比较两个数组(aArr1与aArr2)

时,我对结果感到困惑

我们无法比较这样的数组:aArr1 == aArr2