guy
7 years ago
3 changed files with 267 additions and 69 deletions
@ -1,31 +1,97 @@ |
|||||||
if(![].indexOf){ |
// Production steps of ECMA-262, Edition 5, 15.4.4.14
|
||||||
/** |
// Reference: http://es5.github.io/#x15.4.4.14
|
||||||
* 检查指定的值是否在数组中 |
if (!Array.prototype.indexOf) { |
||||||
* @param {Object} o 要检查的值 |
Array.prototype.indexOf = function (searchElement, fromIndex) { |
||||||
* @return {Number} o在数组中的索引(如果不在数组中则返回-1) |
|
||||||
*/ |
var k; |
||||||
Array.prototype.indexOf = function (o) { |
|
||||||
for (var i = 0, len = this.length; i < len; i++) { |
// 1. Let o be the result of calling ToObject passing
|
||||||
if (_.isEqual(o, this[i])) { |
// the this value as the argument.
|
||||||
return i; |
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; |
return -1; |
||||||
} |
} |
||||||
} |
|
||||||
if(![].lastIndexOf){ |
// 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.
|
||||||
* ie67不支持数组的这个方法 |
k = Math.max(n >= 0 ? n : len - Math.abs(n), 0); |
||||||
* @param {Object} o 要检查的值 |
|
||||||
* @return {Number} o在数组中的索引(如果不在数组中则返回-1) |
// 9. Repeat, while k < len
|
||||||
*/ |
while (k < len) { |
||||||
Array.prototype.lastIndexOf = function (o) { |
// a. Let Pk be ToString(k).
|
||||||
for (var len = this.length, i = len - 1; i >= 0; i--) { |
// This is implicit for LHS operands of the in operator
|
||||||
if (_.isEqual(o, this[i])) { |
// b. Let kPresent be the result of calling the
|
||||||
return i; |
// 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 (!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; |
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