ilo*_*hym 1 javascript for-loop
我只想问一下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
Run Code Online (Sandbox Code Playgroud)
提前致谢
该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()例程,以检查两个对象/数组的值是否确实相等(而不是地址).