我在代码库中遇到了这个代码,用于添加indexOf函数:
if (!Array.prototype.indexOf)
{
Array.prototype.indexOf = function(elt /*, from*/)
{
var len = this.length >>> 0;
var from = Number(arguments[1]) || 0;
from = (from < 0)
? Math.ceil(from)
: Math.floor(from);
if (from < 0)
from += len;
for (; from < len; from++)
{
if (from in this &&
this[from] === elt)
return from;
}
return -1;
};
}
这是与Mozilla https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf推荐的实现不同的实现:
代码:
if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) {
"use strict";
if (this == null) {
throw new TypeError();
}
var t = Object(this);
var len = t.length >>> 0;
if (len === 0) {
return -1;
}
var n = 0;
if (arguments.length > 0) {
n = Number(arguments[1]);
if (n != n) { // shortcut for verifying if it's NaN
n = 0;
} else if (n != 0 && n != Infinity && n != -Infinity) {
n = (n > 0 || -1) * Math.floor(Math.abs(n));
}
}
if (n >= len) {
return -1;
}
var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);
for (; k < len; k++) {
if (k in t && t[k] === searchElement) {
return k;
}
}
return -1;
}
}
我是否应该使用Mozilla版本,或者在问题开头提到的版本是否足够?使用一个优于另一个有优势吗?
答案 0 :(得分:2)
我建议在indexOf上使用Mozilla版本。它与第一个实现非常相似,但更加精致(实际上这并不奇怪)。例如,它将返回-1,因为它发现给定数组为空,并将正确处理作为第二个参数给出的不同边值。
或者更好的是,如果你使用jQuery(因为你的标签选择暗示它),为什么不只是使用它的$.inArray()方法呢?
答案 1 :(得分:2)
他们都来自MDN,但第一个版本来自indexOf
页面的旧版本。较新版本是一个更新,使实现符合ECMAScript 5规范中公布的算法。鉴于这一切,使用较新版本似乎是合理的。
这是MDN页面上进行更改的差异: