我创建了以下代码 http://jsfiddle.net/EbCUx/
var arr = [{a:1,b:2,c:3},{a:3,b:5,c:6}];
var a = arr[0];
alert(arr.indexOf(a));
var b = {a:1,b:2,c:3};
alert(arr.indexOf(b));
即使 a 和 b 的内容相同,为什么 indexOf() 返回 -1 ..我知道 a 是参考值 ..这是原因吗...有人可以解释一下确切的原因吗?
我创建了以下代码 http://jsfiddle.net/EbCUx/
var arr = [{a:1,b:2,c:3},{a:3,b:5,c:6}];
var a = arr[0];
alert(arr.indexOf(a));
var b = {a:1,b:2,c:3};
alert(arr.indexOf(b));
即使 a 和 b 的内容相同,为什么 indexOf() 返回 -1 ..我知道 a 是参考值 ..这是原因吗...有人可以解释一下确切的原因吗?
您正在比较 2 个碰巧在内部具有相同值的不同对象,但从相等的角度来看,它们仍然是不同的对象。
您的原始代码:
<script>
var arr = [{a:1,b:2,c:3},{a:3,b:5,c:6}];
var a = arr[0];
alert(arr.indexOf(a));
var b = {a:1,b:2,c:3};
alert(arr.indexOf(b));
</script>
显示如何在比较中获得匹配的更新版本。
<script>
var b = {a:1,b:2,c:3};
var arr = [b,{a:3,b:5,c:6}];
var a = arr[0];
alert(arr.indexOf(a));
alert(arr.indexOf(b));
</script>
如果要比较碰巧具有相同值的 2 个不同对象,则必须手动进行。
来自MDN:
indexOf 使用严格相等将 searchElement 与 Array 的元素进行比较(与 === 或三等号运算符使用的方法相同)。
由于没有两个对象是严格相等的,因此您不能使用 indexOf 搜索对象数组,您必须循环(如果数组的元素是对象,则扩展 indexOf 以循环)
改用这个
添加此代码:
<script>
Array.prototype.newIndexOf = function( item ) {
var count = this.length;
var j = 0;
while (this[j++] !== item && j < count) {}
return (j === count) ? -1 : j;
}
</script>
indexOf 很慢并且没有严格的相等检查。