美文网首页
剩余参数

剩余参数

作者: 欢西西西 | 来源:发表于2023-03-26 17:21 被阅读0次
    // 剩余参数语法允许我们将一个不定数量的参数表示为一个数组
    
    // let [first, ...lst] = arr; // 编译前
    
    
    
    var _arr = arr,
        _arr2 = _toArray(_arr),
        first = _arr2[0],
        lst = _arr2.slice(1);
    
    
    function _toArray(arr) {
        return _arrayWithHoles(arr) // 数组
            || _iterableToArray(arr) // 可迭代对象转数组
            || _unsupportedIterableToArray(arr) // 继续检查可以转成数组的对象
            || _nonIterableRest(); // 报错
    }
    function _nonIterableRest() {
        throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
    }
    function _unsupportedIterableToArray(o, minLen) {
        if (!o) return;
        if (typeof o === "string") return _arrayLikeToArray(o, minLen);
    
        var n = Object.prototype.toString.call(o).slice(8, -1); // [Object XXX] -> XXX
    
        if (n === "Object" && o.constructor)
            n = o.constructor.name;
        if (n === "Map" || n === "Set")
            return Array.from(o);
        // n是Object,用constructor.name来检查,表示检查的是Map和Set的polyfill创建的对象
        // ES6的Map和Set toString是 '[object Map]' 和 '[object Set]'
    
    
        // Int8Array/Uint8ClampedArray/Int16Array/Uint16Array/Int32Array/Uint32Array
        if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))
            return _arrayLikeToArray(o, minLen);
    }
    function _arrayLikeToArray(arr, len) {
        if (len == null || len > arr.length) len = arr.length;
        for (var i = 0, arr2 = new Array(len); i < len; i++)
            arr2[i] = arr[i];
        return arr2;
    }
    function _iterableToArray(iter) {
        // 检查一个对象是否是可迭代的 
        if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null)
            return Array.from(iter);
        /**
         * iter[Symbol.iterator]属性值是一个函数,它返回一个迭代器对象 
         * let str = 'abc'; let iter = str[Symbol.iterator](); iter.next();
         * 可迭代的对象例如:字符串、数组、arguments、HTMLCollection 、生成器函数返回的迭代器对象、Map、Set。(WeakMap和WeakSet是不能迭代的)
         */
    }
    function _arrayWithHoles(arr) {
        if (Array.isArray(arr))
            return arr;
    }
    

    相关文章

      网友评论

          本文标题:剩余参数

          本文链接:https://www.haomeiwen.com/subject/qviirdtx.html