我只想问一下in_array_orig和in_array_new是不是一样的。 在比较两个数组(aArr1 与 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
提前致谢
最佳答案
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/