Исправление функций JavaScript Array в Internet Explorer (indexOf, forEach и т. Д.) [Закрыто]

137
задан Community 23 May 2017 в 10:30
поделиться

3 ответа

Многие используют альтернативные реализации MDC (например, для indexOf ). Как правило, они строго соответствуют стандартам, вплоть до явной проверки типов всех аргументов.

К сожалению, хотя очевидно, что авторы считают этот код тривиальным и свободно используемым, похоже, нет явного предоставления лицензии, чтобы изложить это в письменной форме. Вики в целом называется CC Attribution-ShareAlike, если это приемлемая лицензия (хотя CC не предназначен для кода как такового).

js-методы в целом выглядят нормально, но не так соответствуют стандартам, какими должны быть функции (например, неопределенные элементы списка, функции, которые изменяют список). Он также полон других случайных нестандартных методов, включая некоторые сомнительные, такие как хитрые stripTags и неполный кодек UTF-8 (который также немного не нужен с учетом трюка unescape (encodeURIComponent) ).

Как бы то ни было, вот что я использую (и тем самым передаю его в общественное достояние, если вообще можно сказать, что оно охраняется авторским правом). Он немного короче, чем версии MDC, поскольку не пытается определить, что вы не сделали чего-то глупого, например, передать нефункциональные обратные вызовы или нецелочисленные индексы, но помимо этого он пытается соответствовать стандартам. (Сообщите мне, если я что-то пропустил.; -))

'use strict';

// Add ECMA262-5 method binding if not supported natively
//
if (!('bind' in Function.prototype)) {
    Function.prototype.bind= function(owner) {
        var that= this;
        if (arguments.length<=1) {
            return function() {
                return that.apply(owner, arguments);
            };
        } else {
            var args= Array.prototype.slice.call(arguments, 1);
            return function() {
                return that.apply(owner, arguments.length===0? args : args.concat(Array.prototype.slice.call(arguments)));
            };
        }
    };
}

// Add ECMA262-5 string trim if not supported natively
//
if (!('trim' in String.prototype)) {
    String.prototype.trim= function() {
        return this.replace(/^\s+/, '').replace(/\s+$/, '');
    };
}

// Add ECMA262-5 Array methods if not supported natively
//
if (!('indexOf' in Array.prototype)) {
    Array.prototype.indexOf= function(find, i /*opt*/) {
        if (i===undefined) i= 0;
        if (i<0) i+= this.length;
        if (i<0) i= 0;
        for (var n= this.length; i<n; i++)
            if (i in this && this[i]===find)
                return i;
        return -1;
    };
}
if (!('lastIndexOf' in Array.prototype)) {
    Array.prototype.lastIndexOf= function(find, i /*opt*/) {
        if (i===undefined) i= this.length-1;
        if (i<0) i+= this.length;
        if (i>this.length-1) i= this.length-1;
        for (i++; i-->0;) /* i++ because from-argument is sadly inclusive */
            if (i in this && this[i]===find)
                return i;
        return -1;
    };
}
if (!('forEach' in Array.prototype)) {
    Array.prototype.forEach= function(action, that /*opt*/) {
        for (var i= 0, n= this.length; i<n; i++)
            if (i in this)
                action.call(that, this[i], i, this);
    };
}
if (!('map' in Array.prototype)) {
    Array.prototype.map= function(mapper, that /*opt*/) {
        var other= new Array(this.length);
        for (var i= 0, n= this.length; i<n; i++)
            if (i in this)
                other[i]= mapper.call(that, this[i], i, this);
        return other;
    };
}
if (!('filter' in Array.prototype)) {
    Array.prototype.filter= function(filter, that /*opt*/) {
        var other= [], v;
        for (var i=0, n= this.length; i<n; i++)
            if (i in this && filter.call(that, v= this[i], i, this))
                other.push(v);
        return other;
    };
}
if (!('every' in Array.prototype)) {
    Array.prototype.every= function(tester, that /*opt*/) {
        for (var i= 0, n= this.length; i<n; i++)
            if (i in this && !tester.call(that, this[i], i, this))
                return false;
        return true;
    };
}
if (!('some' in Array.prototype)) {
    Array.prototype.some= function(tester, that /*opt*/) {
        for (var i= 0, n= this.length; i<n; i++)
            if (i in this && tester.call(that, this[i], i, this))
                return true;
        return false;
    };
}

Другие методы ECMA262-5, не реализованные здесь, включают Array reduce / reduceRight , методы JSON и некоторые другие. новые методы Object , которые можно надежно реализовать в виде JS-функций.

220
ответ дан 23 November 2019 в 23:33
поделиться

Взгляните на Underscore.js

27
ответ дан 23 November 2019 в 23:33
поделиться

Под "не реализовывать ключевые функции" вы на самом деле подразумеваете "соответствует ECMA 262 3'rd ed", верно? :)

Методы, на которые вы ссылаетесь, являются частью новой 5'th edition - для браузеров, не поддерживающих это, вы можете использовать следующий "shim", который расширяет 3'rd в 5'th http://github.com/kriskowal/narwhal-lib/blob/narwhal-lib/lib/global-es5.js.

1
ответ дан 23 November 2019 в 23:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: