guy
7 years ago
3 changed files with 267 additions and 69 deletions
@ -1,31 +1,97 @@
|
||||
if(![].indexOf){ |
||||
/** |
||||
* 检查指定的值是否在数组中 |
||||
* @param {Object} o 要检查的值 |
||||
* @return {Number} o在数组中的索引(如果不在数组中则返回-1) |
||||
*/ |
||||
Array.prototype.indexOf = function (o) { |
||||
for (var i = 0, len = this.length; i < len; i++) { |
||||
if (_.isEqual(o, this[i])) { |
||||
return i; |
||||
// 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 (this == null) { |
||||
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; |
||||
|
||||
// 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; |
||||
} |
||||
}; |
||||
} |
||||
if(![].lastIndexOf){ |
||||
/** |
||||
* 检查指定的值是否在数组中 |
||||
* ie67不支持数组的这个方法 |
||||
* @param {Object} o 要检查的值 |
||||
* @return {Number} o在数组中的索引(如果不在数组中则返回-1) |
||||
*/ |
||||
Array.prototype.lastIndexOf = function (o) { |
||||
for (var len = this.length, i = len - 1; i >= 0; i--) { |
||||
if (_.isEqual(o, this[i])) { |
||||
return i; |
||||
if (!Array.prototype.lastIndexOf) { |
||||
Array.prototype.lastIndexOf = function (searchElement /*, fromIndex*/) { |
||||
'use strict'; |
||||
|
||||
if (this === void 0 || this === null) { |
||||
throw new TypeError(); |
||||
} |
||||
|
||||
var n, k, |
||||
t = Object(this), |
||||
len = t.length >>> 0; |
||||
if (len === 0) { |
||||
return -1; |
||||
} |
||||
|
||||
n = len - 1; |
||||
if (arguments.length > 1) { |
||||
n = Number(arguments[1]); |
||||
if (n != n) { |
||||
n = 0; |
||||
} |
||||
else if (n != 0 && n != (1 / 0) && n != -(1 / 0)) { |
||||
n = (n > 0 || -1) * Math.floor(Math.abs(n)); |
||||
} |
||||
} |
||||
|
||||
for (k = n >= 0 |
||||
? Math.min(n, len - 1) |
||||
: len - Math.abs(n); k >= 0; k--) { |
||||
if (k in t && t[k] === searchElement) { |
||||
return k; |
||||
} |
||||
} |
||||
return -1; |
||||
} |
||||
}; |
||||
} |
Loading…
Reference in new issue