写了简单注释. 具体用法 请参考js1.6手册 .
// 模拟js1.6 Array.prototype.forEach
if (!Array.prototype.forEach) {
Array.prototype.forEach = function(f, oThis) {
if (!f || f.constructor != Function.toString()) return;
oThis = oThis || window;
for (var i = 0, len = this.length; i len; i++) {
f.call(oThis, this[i], i, this); //p1 上下文环境 p2 数组元素 p3 索引 p4 数组对象
}
}
}
//模拟js1.6 Array.prototype.filter
if (!Array.prototype.filter) {
Array.prototype.filter = function(f, oThis) {
if (!f || f.constructor != Function.toString()) return;
oThis = oThis || window;
var a = [];
for (var i = 0, len = this.length; i len; i++) {
if (f.call(oThis, this[i], i, this)) a.push(this[i]);
}
return a;
}
}
//模拟js1.6 Array.prototype.map
if (!Array.prototype.map) {
Array.prototype.map = function(f, oThis) {
if (!f || f.constructor != Function.toString()) return;
oThis = oThis || window;
var a = [];
for (var i = 0, len = this.length; i len; i++) {
a.push(f.call(oThis, this[i], i, this));
}
return a;
}
}
//模拟 js1.6 Array.prototype.every
if (!Array.prototype.every) {
Array.prototype.every = function(f, oThis) {
if (!f || f.constructor != Function.toString()) return;
oThis = oThis || window;
for (var i = 0, len = this.length; i len; i++) {
if (!f.call(oThis, this[i], i, this)) return false;
}
return true;
}
}
//模拟 js1.6 Array.prototype.some
if (!Array.prototype.some) {
Array.prototype.some = function(f, oThis) {
if (!f || f.constructor != Function.toString()) return;
oThis = oThis || window;
for (var i = 0, len = this.length; i len; i++) {
if (f.call(oThis, this[i], i, this)) return true;
}
return false;
}
}
要重点说一说的 indexOf lastIndexOf 两个方法 .. 我只是实现了一个简单版本.但修复了 一点点小问题 . 先看代码
//模拟js1.6 Array.prototype.indexOf方法.并修复ff等其他实现 indexOf方法的浏览器中值类型于引用类型比较相等性一律返回false问题
Array.prototype.indexOf = function(obj) {
for (var i = 0, len = this.length; i len; i++) {
if (compare(this[i], obj)) return i;
}
return -1;
}
//模拟js1.6 Array.prototype.lastIndexOf方法.并修复ff等其他实现 indexOf方法的浏览器中值类型于引用类型比较相等性一律返回false问题
Array.prototype.lastIndexOf = function(obj) {
for (var i = this.length - 1; i = 0; i--) {
if (compare(this[i], obj)) return i;
}
return -1;
}
是的. 注释已经写的明白. 我这里之所以 用这个方法 覆盖了 js1.6 的方法原因在于
//比较对象是否于参数obj 相等..
function compare(obj1, obj2) {
if (obj1 === null || obj1 === undefined || obj2 === null || obj2 === undefined) {
if (obj1 === obj2) return true;
}
else if (obj1 == obj2 && obj1.constructor.toString() == obj2.constructor) return true;
return false;
}
这个 compare方法 . 他解决了一个什么问题呢? 对了! 就是相等性判断. 因为我发现 原始版本的相等性判断 居然会认为
1!=new Number(1) 即 假如数组中存在一个 number对象 而我用 number 直接量去做比较 即使本应该相等. 也会返回false
这于 javascript 引用类型 于值类型做 相等性运算时 会调用引用类型 即对象的 valueOf方法 然后再去做比较 是相违背的.
说明 javascript 1.6 在实现 indexOf方法时 相等性判断 他简单的用了 === 即严格相等判断 ...
那么我写的compare 方法 的作用即 解决这个问题. 让相等性判断 遵循 javascript的原始规则...
说到这里 不得不提一下 老外 在判断 某个对象 为某特定类型时. 会使用 Object.porototyp.toString.call(this) 来做比较. 目的是为了防止
如 [1,2,3].constructor!=iframe.contentWindow.Array 这类情况...
其实大可不必那么麻烦 . 我们只需要调用 两边的构造器对象 的其中一个的toString方法 返回一个 值类型的 string 伪对象即可.
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/webkaifa/)这样 左边的引用类型 也会 自动调用 valueOf方法 于字符串做比较.. 何必 搞的那么麻烦呢?
最后. 恩 总体来说 我非常喜欢 forEach map filter 等等方法 . 好用的很. 由于其他几个方法 都是类似的. 所以 一并写出来了!