guy 7 years ago
parent
commit
8fe9ae8355
  1. 112
      bi/polyfill.js
  2. 112
      docs/polyfill.js
  3. 112
      src/polyfill/array.js

112
bi/polyfill.js

@ -1,33 +1,99 @@
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;
}
// 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; return -1;
} };
} }
if(![].lastIndexOf){ if (!Array.prototype.lastIndexOf) {
/** Array.prototype.lastIndexOf = function (searchElement /*, fromIndex*/) {
* 检查指定的值是否在数组中 'use strict';
* ie67不支持数组的这个方法
* @param {Object} o 要检查的值 if (this === void 0 || this === null) {
* @return {Number} o在数组中的索引如果不在数组中则返回-1 throw new TypeError();
*/ }
Array.prototype.lastIndexOf = function (o) {
for (var len = this.length, i = len - 1; i >= 0; i--) { var n, k,
if (_.isEqual(o, this[i])) { t = Object(this),
return i; 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; return -1;
} };
}/** }/**
* 特殊情况 * 特殊情况
* Created by wang on 15/6/23. * Created by wang on 15/6/23.

112
docs/polyfill.js

@ -1,33 +1,99 @@
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;
}
// 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; return -1;
} };
} }
if(![].lastIndexOf){ if (!Array.prototype.lastIndexOf) {
/** Array.prototype.lastIndexOf = function (searchElement /*, fromIndex*/) {
* 检查指定的值是否在数组中 'use strict';
* ie67不支持数组的这个方法
* @param {Object} o 要检查的值 if (this === void 0 || this === null) {
* @return {Number} o在数组中的索引如果不在数组中则返回-1 throw new TypeError();
*/ }
Array.prototype.lastIndexOf = function (o) {
for (var len = this.length, i = len - 1; i >= 0; i--) { var n, k,
if (_.isEqual(o, this[i])) { t = Object(this),
return i; 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; return -1;
} };
}/** }/**
* 特殊情况 * 特殊情况
* Created by wang on 15/6/23. * Created by wang on 15/6/23.

112
src/polyfill/array.js

@ -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;
}
// 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; return -1;
} };
} }
if(![].lastIndexOf){ if (!Array.prototype.lastIndexOf) {
/** Array.prototype.lastIndexOf = function (searchElement /*, fromIndex*/) {
* 检查指定的值是否在数组中 'use strict';
* ie67不支持数组的这个方法
* @param {Object} o 要检查的值 if (this === void 0 || this === null) {
* @return {Number} o在数组中的索引如果不在数组中则返回-1 throw new TypeError();
*/ }
Array.prototype.lastIndexOf = function (o) {
for (var len = this.length, i = len - 1; i >= 0; i--) { var n, k,
if (_.isEqual(o, this[i])) { t = Object(this),
return i; 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; return -1;
} };
} }
Loading…
Cancel
Save