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 字符串)。第三种解决方案,可能是最常见的,是遍历每个对象中的每个键。这些都不是真正理想的。
这个问题的推荐解决方案是什么?