javascript - for(var i in array) VS for(i=0; i<array.length; i++)

标签 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

提前致谢

最佳答案

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

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

尽管f是一个空对象,它的原型(prototype)(与 JS 中的所有类型一样)包括 Object 的原型(prototype),具有属性 '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()检查两个对象/数组的值是否确实相等的例程(与地址相反)。

关于javascript - for(var i in array) VS for(i=0; i<array.length; i++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5510772/

相关文章:

javascript - 我可以仅将meteor.js 用于后端吗

javascript - 根据屏幕高度选择下拉高度

javascript - 我对 For 循环的理解正确吗?我缺少什么? - JavaScript

python - 作业: never ending loop 5**200000

python - Python for 语句的混淆行为

javascript - jQuery parents ("tr") 淡出不工作

javascript - 尝试在 javascript 中使用 innerHTML 插入整个表

oracle - 是否有其他方法可以在 pl/sql for 循环中表示 'next'?

javascript - 如何用下划线替换数组中的某些字母

javascript - 开 Jest/ enzyme 测试 : this. props.showOverlay 不是函数