下划线的_.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
方法无效。
问题是,在JavaScript中查找数组中Object
索引的最佳方法是什么。一种方法是JSON.stringify(o)
每个项目,这不是明智的表现。另一种方法是为每个项调用toString()
(如果toString()
返回[object Object]
以外的内容,就像ObjectID在node.js的node-native-mongodb模块中那样,返回一个id字符串) 。第三种解决方案,可能是最常见的,是迭代每个对象中的每个键。这些都不是真正理想的。
这个问题的推荐解决方案是什么?