javascript - 在 IE 中将对象转换为数组(Javascript)

标签 javascript arrays object internet-explorer javascript-objects

我可以将 Javascript 中的对象转换为 Internet Explorer 中的数组吗?我读到 IE 不支持 Array.from(obj) 方法。这是正确的吗?

谢谢

最佳答案

您可以通过On Mozilla's MDN自行验证IE 不支持 Array.from() :

enter image description here

在同一页面上,您还可以找到以下内容 polyfill向本身不支持 Array.from() 的浏览器添加对 Array.from() 的支持:

// Production steps of ECMA-262, Edition 6, 22.1.2.1
if (!Array.from) {
  Array.from = (function () {
    var toStr = Object.prototype.toString;
    var isCallable = function (fn) {
      return typeof fn === 'function' || toStr.call(fn) === '[object Function]';
    };
    var toInteger = function (value) {
      var number = Number(value);
      if (isNaN(number)) { return 0; }
      if (number === 0 || !isFinite(number)) { return number; }
      return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number));
    };
    var maxSafeInteger = Math.pow(2, 53) - 1;
    var toLength = function (value) {
      var len = toInteger(value);
      return Math.min(Math.max(len, 0), maxSafeInteger);
    };

    // The length property of the from method is 1.
    return function from(arrayLike/*, mapFn, thisArg */) {
      // 1. Let C be the this value.
      var C = this;

      // 2. Let items be ToObject(arrayLike).
      var items = Object(arrayLike);

      // 3. ReturnIfAbrupt(items).
      if (arrayLike == null) {
        throw new TypeError('Array.from requires an array-like object - not null or undefined');
      }

      // 4. If mapfn is undefined, then let mapping be false.
      var mapFn = arguments.length > 1 ? arguments[1] : void undefined;
      var T;
      if (typeof mapFn !== 'undefined') {
        // 5. else
        // 5. a If IsCallable(mapfn) is false, throw a TypeError exception.
        if (!isCallable(mapFn)) {
          throw new TypeError('Array.from: when provided, the second argument must be a function');
        }

        // 5. b. If thisArg was supplied, let T be thisArg; else let T be undefined.
        if (arguments.length > 2) {
          T = arguments[2];
        }
      }

      // 10. Let lenValue be Get(items, "length").
      // 11. Let len be ToLength(lenValue).
      var len = toLength(items.length);

      // 13. If IsConstructor(C) is true, then
      // 13. a. Let A be the result of calling the [[Construct]] internal method 
      // of C with an argument list containing the single item len.
      // 14. a. Else, Let A be ArrayCreate(len).
      var A = isCallable(C) ? Object(new C(len)) : new Array(len);

      // 16. Let k be 0.
      var k = 0;
      // 17. Repeat, while k < len… (also steps a - h)
      var kValue;
      while (k < len) {
        kValue = items[k];
        if (mapFn) {
          A[k] = typeof T === 'undefined' ? mapFn(kValue, k) : mapFn.call(T, kValue, k);
        } else {
          A[k] = kValue;
        }
        k += 1;
      }
      // 18. Let putStatus be Put(A, "length", len, true).
      A.length = len;
      // 20. Return A.
      return A;
    };
  }());
}

请注意,它带有以下备注:

This algorithm is exactly the one specified in ECMA-262, 6th edition, assuming Object and TypeError have their original values and that callback.call evaluates to the original value of Function.prototype.call. In addition, since true iterables can not be polyfilled, this implementation does not support generic iterables as defined in the 6th edition of ECMA-262.

这意味着有一些警告,但对于大多数目的来说应该足够了!

关于javascript - 在 IE 中将对象转换为数组(Javascript),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44828617/

相关文章:

javascript - 使用 requireJs 和 BackboneJs 在渲染之前组合多个模板

javascript - 在保持向后兼容性的同时保持创新(在网页设计/开发中)

mysql - 将数组合并和排序为一个的公式/算法

java - 两个不同的变量指向同一内存位置

javascript - JQuery 轮播是跳动的

javascript - Jquery 可排序。在选中/拖动时调整 CSS

c - 为什么我不能在 C 中传递的函数内打印数组的大小?

javascript - 如何根据对象中的属性合并对象数组中的对象

css 解释 html 时间对象

javascript - 从方法对象获取窄类型