ie11尝试使用flat()polyfill方法会在polyfill中导致错误

时间:2019-06-05 22:35:35

标签: javascript internet-explorer-11

我的代码中一直说错了

object does not support function or method split

导致错误的函数如下:

function convertSpecial(a,b,c) {
var aCopy = a.split("");
for (var i = 0; i < aCopy.length; i++) {
    if (aCopy[i].includes(b)) {
        if (c == '') {
            aCopy[i] = aCopy[i].replace(b,c);
        } else {
            aCopy[i] = aCopy[i].replace(b,c).split(' ');
            aCopy = aCopy.flat();
        }
    }
}

return aCopy;
}

我认为由于在我的代码中使用了.flat()而导致了此错误。

但是,polyfill也不起作用。我说一个错误;预计在此行:

for (var el of array) {

下面的Babel修复也不能解决我的问题。使用下面的方法,我仍然得到该对象不支持方法拆分错误。

if (!Array.prototype.flat) {
Array.prototype.flat = function (depth) {
var flattened = [];

(function flat(array, depth) {
  var _iteratorNormalCompletion = true;
  var _didIteratorError = false;
  var _iteratorError = undefined;

  try {
    for (var _iterator = array[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
      var el = _step.value;

      if (Array.isArray(el) && depth > 0) {
        flat(el, depth - 1);
      } else {
        flattened.push(el);
      }
    }
  } catch (err) {
    _didIteratorError = true;
    _iteratorError = err;
  } finally {
    try {
      if (!_iteratorNormalCompletion && _iterator.return != null) {
        _iterator.return();
      }
    } finally {
      if (_didIteratorError) {
        throw _iteratorError;
      }
    }
  }
})(this, Math.floor(depth) || 1);

return flattened;
};
}

那么什么可能导致我的问题呢?

2 个答案:

答案 0 :(得分:0)

Internet Explorer不支持ES6 +功能,包括for..of,因此给定的polyfill不起作用。

阅读proposal specification

  
      
  1. 让targetIndex开始。

  2.   
  3. 让sourceIndex为0。

  4.   
  5. 重复,而sourceIndex

  6.   

从索引0开始迭代数组,以1递增直到达到长度。因此,与其使用混乱的迭代器(IE无法理解Symbol),不如使用简单的for循环来手动进行递增。

由于给定的polyfill取决于Array.isArray,因此请确保也对其进行polyfill。

以下代码段按预期在IE11上运行:

console.log(
  [1, [2, 3]].flat()
);
<script>
// Also polyfill Array.isArray:
if (!Array.isArray) {
  Array.isArray = function(arg) {
    return Object.prototype.toString.call(arg) === '[object Array]';
  };
}

// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat#Polyfill
if (!Array.prototype.flat) {
  Array.prototype.flat = function(depth) {
    var flattened = [];
    (function flat(array, depth) {
      for (var i = 0; i < array.length; i++) {
        var el = array[i];
        if (Array.isArray(el) && depth > 0) {
          flat(el, depth - 1); 
        } else {
          flattened.push(el);
        }
      }
    })(this, Math.floor(depth) || 1);
    return flattened;
  };
}
</script>

答案 1 :(得分:0)

解决了问题!

function convertSpecial(a,b,c) {
var aCopy = a.toString().split("");
for (var i = 0; i < aCopy.length; i++) {
if (aCopy[i].includes(b)) {
    if (c == '') {
        aCopy[i] = aCopy[i].replace(b,c);
    } else {
        aCopy[i] = aCopy[i].replace(b,c).toString().split(' ');
        aCopy = aCopy.flat();
    }
}
}

return aCopy;
}