1

Underscore 的_.indexOf方法如下所示:

var nativeIndexOf = Array.prototype.indexOf;

_.indexOf = function(array, item, isSorted) {
  if (array == null) return -1;
  var i, l;
  if (isSorted) {
    i = _.sortedIndex(array, item);
    return array[i] === item ? i : -1;
  }
  if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item);
  for (i = 0, l = array.length; i < l; i++) if (i in array && array[i] === item) return i;
  return -1;
};

在该方法的底部,它尝试使用本机indexOf实现,否则它将两者与身份运算符进行比较===

标识运算符===适用于如下原始对象:

console.log("asdf" === "asdf"); // true
console.log(1 === 1); // true
console.log(1 === 1.0); // true
console.log(null === null); // true
console.log(undefined === undefined); // true

但它显然不适用于两个Object实例,即使它们具有相同的属性和值:

console.log({} === {}); // false
console.log({} == {}); // false
var o = {};
console.log(o === o); // true

如果数组中的项目是类型,这会使该indexOf方法不起作用。Object

Object问题是,在 JavaScript 中查找数组中的索引的最优化方法是什么。一种方法是针对JSON.stringify(o)每个项目,这在性能方面没有意义。另一种方法是调用toString()每个项目(如果toString()返回的不是[object Object],就像 Node.js 的 node-native-mongodb 模块中的 ObjectID 一样,返回一个 id 字符串)。第三种解决方案,可能是最常见的,是遍历每个对象中的每个键。这些都不是真正理想的。

这个问题的推荐解决方案是什么?

4

0 回答 0