我只想问一下 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
提前致谢
答案 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)
答案 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