我创建了以下代码 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));
为什么indexOf()返回-1,尽管a和b的内容相同.. 我知道a是一个参考值..这就是原因......任何人都能解释我的确切原因吗?
答案 0 :(得分:4)
您正在比较碰巧在内部具有相同值的两个不同对象,但它们仍然是从相等角度看的不同对象。
您的原始代码:
<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个不同对象,则必须手动执行此操作。
答案 1 :(得分:3)
来自MDN:
indexOf使用严格相等(使用===或三等号运算符使用的相同方法)将searchElement与Array的元素进行比较。
由于没有两个对象严格相等,你不能使用indexOf来搜索对象数组,你必须循环(或者如果数组的元素是对象,则将indexOf扩展为循环)
答案 2 :(得分:1)
改为使用
添加以下代码:
<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很慢,没有严格的同等检查。