for(var in aArray)VS for(i = 0; i <aArray.length; i ++)

ilo*_*hym 1 javascript for-loop

我只想问一下in_array_origin_array_new是否相同.当比较两个数组(aArr1aArr2)时,我也对结果感到困惑.

谁能解释我 谢谢

这是我的示例测试代码

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
Run Code Online (Sandbox Code Playgroud)

提前致谢

dav*_*vin 6

in运营商如果该属性是在对象返回true.这包括在原型链中查找.例如:

Object.prototype.k = 5;
f = {};
'k' in f; // true
Run Code Online (Sandbox Code Playgroud)

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

虽然你没有问,这里只是一个有用的函数来检查对象自己的属性.hasOwnProperty(),所以在我们上面的例子中:

f.hasOwnProperty('k'); // false, that's more what we would expect
Run Code Online (Sandbox Code Playgroud)

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

因此,如果您正在使用数组in_array_orig,并且对于您对其属性感兴趣的对象,请使用in_array_new(应该适当地重命名,in_obj或者某些内容).

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