Array.prototype.indexOf = function(obj, start) {
for (var i = (start || 0), j = this.length; i < j; i++) {
if (this[i] === obj) { return i; }
}
return -1;
}
我何时应该实现此功能? />是否应该通过以下检查将其包装在我的所有页面上,该检查将检查原型函数是否存在,如果不存在,则继续扩展Array原型吗? >还是浏览器检查一下,如果它是Internet Explorer,则只需实施它?
if (!Array.prototype.indexOf) {
// Implement function here
}
#1 楼
像这样...if (!Array.prototype.indexOf) {
}
按照MDC推荐的兼容性。 。
评论
我没有足够的代表来编辑问题,但请随时删除ECMAScript术语,并使用适当的措词替换。再次感谢
– Bobby Borszich
09年11月16日19:47
如果使用这种检测,请小心。在测试它之前,另一个库可能已实现此功能,并且它可能不符合标准(原型已在不久前完成)。如果我在一个敌对的环境中工作(许多其他编码器使用许多不同的库),那么我将不信任任何这些...
–巴勃罗·卡布雷拉(Pablo Cabrera)
09年11月17日在11:38
“链接”列--->非常方便!我喜欢这里的答案:stackoverflow.com/questions/1744310/…
–戈登
2015年11月6日在21:49
是否必须将其包装在每个js文件中?
–rd22
16-2-22在10:04
谁是MDC?
– Ferrybig
18年7月4日在15:12
#2 楼
另外,您也可以使用jQuery 1.2 inArray函数,该函数应可跨浏览器使用:jQuery.inArray( value, array [, fromIndex ] )
评论
'indexOf'是本机代码(右),因此jQuery'inArray()'会如此之快,例如在可用时使用本机,而在不可用时使用poly-fill吗?
–each
13年3月7日在17:12
好的,可以回答我自己的评论(以上),我刚刚实现了它,并且在Chrome上与使用'indexOf()'时一样快,但是在IE 8中它非常非常慢...所以至少我们知道“ inArray()”在可能的情况下使用本机。
–each
13年3月7日在17:22
#3 楼
完整的代码如下:if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function(obj, start) {
for (var i = (start || 0), j = this.length; i < j; i++) {
if (this[i] === obj) { return i; }
}
return -1;
}
}
要获得真正的完整答案和代码以及其他数组函数,请查看堆栈溢出问题。 Internet Explorer(indexOf,forEach等)。
评论
谢谢你吃饱了。每当我在新项目中需要跨平台indexOf时,我都会经常访问此页面,并且您的代码段是唯一具有完整代码的代码段。 :)当一个人频繁访问此页面时,这几秒钟的确加起来。
– dylnmc
17年7月7日在21:11
#4 楼
underscore.js库具有indexOf函数,可以代替使用:_.indexOf([1, 2, 3], 2)
评论
该答案避免了弄乱数组原型,并且在可用时将其委托给本机indexOf。我喜欢。
–布拉德·科赫(Brad Koch)
2012-10-18 20:08
如果您能够加入下划线或破折号,这似乎是最简单的方法
–克里斯里奇
16 Mar 1 '16 at 23:03
#5 楼
您应该检查是否未使用if (!Array.prototype.indexOf)
定义它。您必须在indexOf
语句中使用===
而不是==
,否则根据您的实现,if (this[i] == obj)
将为1,这是不正确的。我建议您在MDC上使用该实现。
#6 楼
有Mozilla官方解决方案:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf
(function() {
/**Array*/
// Production steps of ECMA-262, Edition 5, 15.4.4.14
// Reference: http://es5.github.io/#x15.4.4.14
if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function(searchElement, fromIndex) {
var k;
// 1. Let O be the result of calling ToObject passing
// the this value as the argument.
if (null === this || undefined === this) {
throw new TypeError('"this" is null or not defined');
}
var O = Object(this);
// 2. Let lenValue be the result of calling the Get
// internal method of O with the argument "length".
// 3. Let len be ToUint32(lenValue).
var len = O.length >>> 0;
// 4. If len is 0, return -1.
if (len === 0) {
return -1;
}
// 5. If argument fromIndex was passed let n be
// ToInteger(fromIndex); else let n be 0.
var n = +fromIndex || 0;
if (Math.abs(n) === Infinity) {
n = 0;
}
// 6. If n >= len, return -1.
if (n >= len) {
return -1;
}
// 7. If n >= 0, then Let k be n.
// 8. Else, n<0, Let k be len - abs(n).
// If k is less than 0, then let k be 0.
k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
// 9. Repeat, while k < len
while (k < len) {
// a. Let Pk be ToString(k).
// This is implicit for LHS operands of the in operator
// b. Let kPresent be the result of calling the
// HasProperty internal method of O with argument Pk.
// This step can be combined with c
// c. If kPresent is true, then
// i. Let elementK be the result of calling the Get
// internal method of O with the argument ToString(k).
// ii. Let same be the result of applying the
// Strict Equality Comparison Algorithm to
// searchElement and elementK.
// iii. If same is true, return k.
if (k in O && O[k] === searchElement) {
return k;
}
k++;
}
return -1;
};
}
})();
评论
只是学究式的,但MDN不只是Mozilla。这是一个由社区推动的项目,其中包含Mozilla员工以及志愿者,任何人都可以加入并贡献力量。
–ste2425
16年1月4日在16:15
#7 楼
我会向所有需要缺少功能的人推荐:http://code.google.com/p/ddr-ecma5/
它会带来大多数缺少的功能ecma5对较旧的浏览器的功能:)
评论
**尽管我会注意到该lib在IE7中存在问题。
–乔什·麦克(Josh Mc)
2012年6月14日下午5:34
#8 楼
这是我的实现。本质上,在页面上的任何其他脚本之前添加此代码。即在您的Internet Explorer 8全局解决方案大师中,我还添加了trim函数,该函数似乎在框架分配中使用。<!--[if lte IE 8]>
<script>
if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function(obj, start) {
for (var i = (start || 0), j = this.length; i < j; i++) {
if (this[i] === obj) {
return i;
}
}
return -1;
};
}
if(typeof String.prototype.trim !== 'function') {
String.prototype.trim = function() {
return this.replace(/^\s+|\s+$/g, '');
};
};
</script>
<![endif]-->
#9 楼
它对我有用。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;
};
}
#10 楼
使用Underscore.jsvar arr=['a','a1','b']
_.filter(arr, function(a){ return a.indexOf('a') > -1; })
评论
实际上Array.prototype.indexOf不是ECMA-262 / ECMAScript的一部分。参见ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf也许您在想String.prototype.indexOf ...这是一个扩展,不是原始标准的一部分。但是,应将其作为Javascript 1.6的一部分(IE无法做到)实现developer.mozilla.org/en/New_in_JavaScript_1.6
@Josh:只是指“ IE无法实现ECMAScript函数...”
您对Array.indexOf的实现不考虑负起始索引。在此处查看Mozilla建议的权宜之计实现:developer.mozilla.org/en/JavaScript/Reference/Global_Objects / ...
我已将问题更新为使用“ ===”,因为我担心人们会使用“ ==”来复制它,这将是错误的-那样就可以了。请参阅Eli Grey的答案。