Javascript Array.indexOf()在应用于对象数组时显示奇怪的行为

时间:2012-05-03 19:50:27

标签: javascript arrays object indexof

我创建了以下代码 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是一个参考值..这就是原因......任何人都能解释我的确切原因吗?

3 个答案:

答案 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很慢,没有严格的同等检查。

  

http://jsperf.com/indexof-vs-equaling/2