让ie以及老版本w3c浏览器 也支持 js1.6的 数组对象的 几个新增方

2016-02-19 16:16 5 1 收藏

有了下面这个让ie以及老版本w3c浏览器 也支持 js1.6的 数组对象的 几个新增方教程,不懂让ie以及老版本w3c浏览器 也支持 js1.6的 数组对象的 几个新增方的也能装懂了,赶紧get起来装逼一下吧!

【 tulaoshi.com - Web开发 】

  写了简单注释. 具体用法 请参考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 的方法原因在于

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)

//比较对象是否于参数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 伪对象即可.

  这样 左边的引用类型 也会 自动调用 valueOf方法 于字符串做比较.. 何必 搞的那么麻烦呢?

  最后. 恩 总体来说 我非常喜欢 forEach  map filter 等等方法 . 好用的很. 由于其他几个方法 都是类似的. 所以 一并写出来了! 

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)

来源:http://www.tulaoshi.com/n/20160219/1611511.html

延伸阅读
标签: Web开发
本文章是一位webjx.com的网友在进行网站更新与调整时,进行W3C XHTML1.0验证的时候的一些经验。 总结出通过W3C XHTML1.0标准需要注意的九个问题: 一、在 div class=tzhI am TZH!/div 这段语句中有什么错误? 标点符号问题。这其实也是大家最容易忽视的问题,其实就是小小的两个引号,就造成了这个错误。虽然很多浏览器在不加引号...
标签: Web开发
W3C validation有时难以操作,但用它你可以查看由版面设计引起的差错。验证程序抛出大量差错和警告,说明你的XHTML尚未完善,可能无法在不同浏览器上保持一致功能。下面十个细微的失效问题难住了大批程序员,我们告诉你如何解决。在本文开始前介绍一些使用W3C验证程序时需要注意的问题。 不要担心验证程序的警告如果验证程序说发现12...
标签: Web开发
严格来说不是光CSS就能令IE浏览器崩溃(crash),而要配合一定的XHTML架构。到现时为止发现有两种写法的代码分别会令IE6、IE7崩溃,至于原因我尝试寻找过答案但至今还没找到…如你有这方面的认识或更详细的资料很希望你能分享一下! 令浏览器崩溃的代码如下: Crash IE6 style type="text/css" a{position:relative;} a:hover{float:l...
标签: Web开发
介绍 毫无疑问,任何一个试图使用 CSS 的网页设计师和开发人员都会发现不同的浏览器要求不同的样式声明。这些烦恼归咎于各浏览器及其各版本不同程度的 CSS 执行的完整性。条件 CSS 是这个问题的一个解决方案,采用的是 Internet Explorer 的条件注释语法的思想,并把它内联到 CSS 声明之中。 基本用法 条件 CSS 主要用于指出一个特别...
第一步:打开IE浏览器,在工具栏找到工具,打开Internet选项。 第二步:显示internet选项之后,切换到内容,点击自动完成下方的设置。 第三步:显示自动完成设置,取消勾选浏览历史记录和收藏夹,前几确定。 第四步:这样我们IE浏览器...

经验教程

854

收藏

44
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部