IE не поддерживает методы Array includes или String.

Я работаю над проектом и разрабатываю фреймворк JavaScript. Исходный код составляет около 700 строк, поэтому я вставил только эту строку. Метод include не работает в Internet Explorer. Есть ли решение для этого?

var row_cells = tbl_row.match(/<td[\s\S]*?<\/td>/g);

    row.Cells = new Array();
    if (onRowBindFuncText != null) { /*Fonksyon tanımlanmaışsa daha hızlı çalış*/

        var cellCount = 0;
        for (i = 0; i < row_cells.length; i++) {

            var cell = new Cell();
            $.each(this, function (k, v) {

                if ((row_cells[i]+"").includes("#Eval(" + k + ")")) {

                    cell.Keys.push(new Key(k,v));

... Код продолжается


person Onur Emrecan Özcan    schedule 04.07.2015    source источник
comment
Есть ли эквивалентный метод? Разве люди не проверяют, включена ли строка в другую строку в Internet Explorer? :)   -  person Onur Emrecan Özcan    schedule 04.07.2015
comment
Я решил это с помощью метода indexOf ..   -  person Onur Emrecan Özcan    schedule 04.07.2015


Ответы (6)


Поскольку он не поддерживается в IE, он также не поддерживается в Opera (см. таблицу совместимости), но вы можете использовать предложенный polyfill:

Полифилл

Этот метод был добавлен в спецификацию ECMAScript 2015 и может быть пока недоступен во всех реализациях JavaScript. Однако вы можете легко использовать этот метод полифилла:

if (!String.prototype.includes) {
  String.prototype.includes = function(search, start) {
    'use strict';
    if (typeof start !== 'number') {
      start = 0;
    }

    if (start + search.length > this.length) {
      return false;
    } else {
      return this.indexOf(search, start) !== -1;
    }
  };
}
person alessandro    schedule 04.07.2015
comment
Спасибо @InferOn. Это отличный материал. Я беру JavaScript прямо сейчас, но хотел спросить, что такое переменная arguments, передаваемая в apply()? Я console.log() это в IE и вижу, что это какой-то Argument объект, но я не понимаю, откуда он в точности, поскольку он нигде не определен. - person Yu Chen; 03.10.2017
comment
developer.mozilla.org/en-US/docs/ Web / JavaScript / Reference / может вам помочь - person alessandro; 03.10.2017

@ Infer-on показал отличный ответ, но у него есть проблема в конкретной ситуации. Если вы используете цикл for-in, он вернет функцию include, которую вы добавили.

Вот еще один поллифил.

if (!Array.prototype.includes) {
  Object.defineProperty(Array.prototype, "includes", {
    enumerable: false,
    value: function(obj) {
        var newArr = this.filter(function(el) {
          return el == obj;
        });
        return newArr.length > 0;
      }
  });
}
person Sunho Hong    schedule 28.09.2016
comment
=== вместо == - person Nathan B; 03.03.2020
comment
могу я предложить улучшение: value: item => this.some(el => el === item) - person tibalt; 19.05.2020
comment
Вопрос касается include () для строки, а не массива - person Pablo Pazos; 23.10.2020
comment
Производительность не будет хорошей, когда вы обнаружите первое появление, вам следует прекратить повторение. - person yairniz; 13.06.2021

Вы можете просто использовать .search ()> -1, который ведет себя точно так же. http://www.w3schools.com/jsref/jsref_search.asp

if ((row_cells[i]+"").search("#Eval(" + k + ")") > -1) {
person Patrick Duncan    schedule 07.07.2016

Этот выбранный ответ предназначен для String. Если вы ищете 'include' в массиве, я решил свою проблему в проекте Angular, добавив следующее в мой файл polyfills.ts:

import 'core-js/es7/array';
person patrickbadley    schedule 26.06.2018
comment
Что случилось с polyfills.ts? Почему у вас есть этот файл в вашем проекте? - person KimchiMan; 13.06.2021
comment
Хороший вопрос, я только что понял, что этот вопрос не относится к Angular, когда я опубликовал свой ответ, поэтому мой ответ может сбивать с толку (я обновил его, чтобы указать, что он относится к Angular). polyfills.ts выходит из коробки с новым проектом angular (8/9/10 ...). - person patrickbadley; 14.06.2021

Это полифилл для проектов TypeScript, взятый из https://developer.mozilla.org/nl/docs/Web/JavaScript/Reference/Global_Objects/Array/includes и изменен на действительный TypeScript:

if (!Array.prototype.includes) {
    Object.defineProperty(Array.prototype, 'includes', {
        value: function(searchElement, fromIndex) {

            if (this == null) {
                throw new TypeError('"this" is null or not defined');
            }

            const o = Object(this);
            // tslint:disable-next-line:no-bitwise
            const len = o.length >>> 0;

            if (len === 0) {
                return false;
            }
            // tslint:disable-next-line:no-bitwise
            const n = fromIndex | 0;
            let k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);

            while (k < len) {
                if (o[k] === searchElement) {
                    return true;
                }
                k++;
            }
            return false;
        }
    });
}
person mvermand    schedule 16.10.2018

У jquery есть решение для этого:

if ($.inArray(val,ar)===-1){
    console.log ("val not found in ar");
}
else{
    console.log ("val found in ar");
}

функция $ .inArray (val, ar, [startIndex]).

person shayuna    schedule 19.07.2021