【问题标题】:IE does not support Array includes or String includes methodsIE 不支持数组包含或字符串包含方法
【发布时间】:2015-09-22 03:40:47
【问题描述】:

我一直在从事一个项目并开发一个 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));

...代码继续

【问题讨论】:

  • 有没有等效的方法?人们不检查一个 str 是否包含在 internet explorer 的其他 str 中吗? :)
  • 我刚刚通过 indexOf 方法解决了这个问题..

标签: javascript internet-explorer ecmascript-2016


【解决方案1】:

jquery 有一个解决方案:

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

$.inArray(val,ar,[startingIndex]) 函数。

【讨论】:

    【解决方案2】:

    这个选定的答案是针对字符串的,如果您在数组上寻找“包含”,我通过将以下内容添加到我的 polyfills.ts 文件中解决了我在 Angular 项目中的问题:

    import 'core-js/es7/array';
    

    【讨论】:

    • polyfills.ts 怎么了?为什么你的项目中有那个文件?
    • 好问题,当我发布我的答案时,我刚刚意识到这个问题并不是 Angular 特有的,所以我的答案可能会令人困惑(我更新了它以指定它与 Angular 相关)。 polyfills.ts 开箱即用,带有一个新的 angular (8/9/10...) 项目。
    【解决方案3】:
    var includes = function(val, str) {
      return str.indexOf(val) >= 0;
    };
    

    【讨论】:

      【解决方案4】:
      if (fullString.indexOf("partString") >= 0) {
      //true 
      
      } else {
      //false
      }
      

      【讨论】:

        【解决方案5】:

        这是一个用于 TypeScript 项目的 polyfill,取自 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;
                }
            });
        }
        

        【讨论】:

          【解决方案6】:

          因为IE不支持,所以Opera也不支持(see the compatibility table),但是你可以使用建议的polyfill

          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;
              }
            };
          }
          

          【讨论】:

          • 感谢@InferOn。这是很棒的东西。我现在正在学习 JavaScript,但想问一下传递给 apply()arguments 变量到底是什么?我在 IE 中 console.log() 它并看到它是某种 Argument 对象,但我不明白它的确切来源,因为它似乎没有在任何地方定义。
          【解决方案7】:

          @Infer-on 给出了很好的答案,但在特定情况下存在问题。如果您使用 for-in 循环,它将返回包含您添加的“包含”函数。

          这是另一个 pollyfill。

          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;
                }
            });
          }
          

          【讨论】:

          • === 而不是 ==
          • 我可以提出改进建议吗:value: item =&gt; this.some(el =&gt; el === item)
          • 问题是关于字符串而不是数组的includes()
          • 性能不好,当你发现第一次出现时你应该停止迭代。
          【解决方案8】:

          您可以只使用 .search() > -1 ,它的行为方式完全相同。 http://www.w3schools.com/jsref/jsref_search.asp

          if ((row_cells[i]+"").search("#Eval(" + k + ")") > -1) {
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-12-23
            • 1970-01-01
            • 2019-12-13
            • 2012-05-29
            • 2016-11-20
            • 2015-05-24
            • 2015-04-11
            • 1970-01-01
            相关资源
            最近更新 更多