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

Javascript Array.indexOf() shows strange behaviour when applied to array of objects

本文关键字:数组 indexOf Array 对象 应用于 Javascript      更新时间:2023-09-26

我创建了以下代码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 是参考值..是不是原因...谁能解释一下确切的原因?

您正在比较 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 与数组的元素进行比较。

由于没有两个对象是严格相等的,因此不能使用 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 很慢,没有严格的相等检查。

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