站長資訊網
        最全最豐富的資訊網站

        es6的三個點是什么函數

        es6的三個點不是函數,而是一種運算符。三個點“…”指的是“擴展運算符”,可將可迭代對象展開到其單獨的元素中;所謂的可迭代對象就是任何能用for of循環進行遍歷的對象,例如數組、字符串、Map、Set、DOM節點等。

        es6的三個點是什么函數

        前端(vue)入門到精通課程:進入學習
        Apipost = Postman + Swagger + Mock + Jmeter 超好用的API調試工具:點擊使用

        本教程操作環境:windows7系統、javascript1.8.5版、Dell G3電腦。

        擴展操作符 … 是ES6中引入的,將可迭代對象展開到其單獨的元素中,所謂的可迭代對象就是任何能用for of循環進行遍歷的對象,例如:數組(數組常用方法)、字符串、Map (悟透Map)、Set (Set 如何使用?)、DOM節點等。

        數組擴展運算符

        擴展運算符(spread)是三個點(...)。它好比 rest 參數的逆運算,將一個數組轉為用逗號分隔的參數序列。擴展運算符與正常的函數參數可以結合使用,后面也可以放置表達式,但如果后面是一個空數組,則不產生任何效果。

        let arr = []; arr.push(...[1,2,3,4,5]); console.log(arr); //[1,2,3,4,5] console.log(1, ...[2, 3, 4], 5) //1 2 3 4 5 console.log(...(1 > 0 ? ['a'] : [])); //a console.log([...[], 1]); //[1]
        登錄后復制

        意義

        替代函數的apply方法

        由于擴展運算符可以展開數組,所以不再需要apply方法,將數組轉為函數的參數了。

        // ES5 的寫法 Math.max.apply(null, [14, 3, 77]) // ES6 的寫法 Math.max(...[14, 3, 77])
        登錄后復制

        應用

        • 復制數組

          // ES5 的寫法 const a1 = [1, 2]; const a2 = a1.concat(); // ES6 的寫法 const a1 = [1, 2]; const a2 = [...a1]; //或 const [...a2] = a1;
          登錄后復制

        • 合并數組

          // ES5 的寫法 [1, 2].concat(more); arr1.concat(arr2, arr3); // ES6 的寫法 [1, 2, ...more]; [...arr1, ...arr2, ...arr3]
          登錄后復制

        • 與解構賦值結合

          // ES5 的寫法 a = list[0], rest = list.slice(1) // ES6 的寫法 [a, ...rest] = list
          登錄后復制

          注意:如果將擴展運算符用于數組賦值,只能放在參數的最后一位,否則會報錯。

        • 轉換字符串

          擴展運算符還可以將字符串轉為真正的數組,并且能夠正確識別四個字節的 Unicode 字符。

          'xuD83DuDE80y'.length // 4 [...'xuD83DuDE80y'].length // 3  let str = 'xuD83DuDE80y'; str.split('').reverse().join('') // 'yuDE80uD83Dx' [...str].reverse().join('')      // 'yuD83DuDE80x'
          登錄后復制

        • 實現Iterator接口的對象

          任何 Iterator 接口的對象(參閱 Iterator 一章),都可以用擴展運算符轉為真正的數組。

        • Map和Set結構、Generator函數

          • 擴展運算符內部調用的是數據結構的 Iterator 接口,因此只要具有 Iterator 接口的對象,都可以使用擴展運算符,比如 Map 結構。

          let map = new Map([  [1, 'one'],  [2, 'two'],  [3, 'three'], ]);  let arr = [...map.keys()]; // [1, 2, 3]
          登錄后復制

          • Generator 函數運行后,返回一個遍歷器對象,因此也可以使用擴展運算符。

          const go = function*(){  yield 1;  yield 2;  yield 3; };  [...go()] // [1, 2, 3]
          登錄后復制

          • 如果對沒有 Iterator 接口的對象,使用擴展運算符,將會報錯。

        對象的擴展運算符

        概念

        對象的解構賦值用于從一個對象取值,相當于將目標對象自身的所有可遍歷的(enumerable)、但尚未被讀取的屬性,分配到指定的對象上面。所有的鍵和它們的值,都會拷貝到新對象上面。

        let { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 }; x // 1 y // 2 z // { a: 3, b: 4 }
        登錄后復制

        注意:

        • 由于解構賦值要求等號右邊是一個對象,所以如果等號右邊是undefinednull,就會報錯,因為它們無法轉為對象。

        • 解構賦值必須是最后一個參數,否則會報錯。

        • 解構賦值的拷貝是淺拷貝,即如果一個鍵的值是復合類型的值(數組、對象、函數)、那么解構賦值拷貝的是這個值的引用,而不是這個值的副本。

          let obj = { a: { b: 1 } }; let { ...x } = obj; obj.a.b = 2; x.a.b // 2
          登錄后復制

        • 擴展運算符的解構賦值,不能復制繼承自原型對象的屬性。

          let o1 = { a: 1 }; let o2 = { b: 2 }; o2.__proto__ = o1; let { ...o3 } = o2; o3 // { b: 2 } o3.a // undefined   const o = Object.create({ x: 1, y: 2 }); o.z = 3;  let { x, ...newObj } = o; let { y, z } = newObj; x // 1 y // undefined z // 3  let { x, ...{ y, z } } = o; // SyntaxError: ... must be followed by an identifier in declaration contexts
          登錄后復制

        應用

        • 擴展某個函數的參數,引入其他操作。

        function baseFunction({ a, b }) { // ... } function wrapperFunction({ x, y, ...restConfig }) { // 使用 x 和 y 參數進行操作 // 其余參數傳給原始函數 return baseFunction(restConfig); }
        登錄后復制

        • 取出參數對象的所有可遍歷屬性,拷貝到當前對象之中。

        let z = { a: 3, b: 4 }; let n = { ...z }; n // { a: 3, b: 4 }  let aClone = { ...a }; // 等同于 let aClone = Object.assign({}, a);  //上面的例子只是拷貝了對象實例的屬性,如果想完整克隆一個對象,還拷貝對象原型的屬性,可以采用下面的寫法。 // 寫法一 const clone1 = Object.assign( Object.create(Object.getPrototypeOf(obj)), obj ); // 寫法二 const clone2 = Object.create( Object.getPrototypeOf(obj), Object.getOwnPropertyDescriptors(obj) )
        登錄后復制

        • 合并兩個對象。

          let ab = { ...a, ...b }; // 等同于 let ab = Object.assign({}, a, b);   //如果用戶自定義的屬性,放在擴展運算符后面,則擴展運算符內部的同名屬性會被覆蓋掉。 let aWithOverrides = { ...a, x: 1, y: 2 }; // 等同于 let aWithOverrides = { ...a, ...{ x: 1, y: 2 } }; // 等同于 let x = 1, y = 2, aWithOverrides = { ...a, x, y }; // 等同于 let aWithOverrides = Object.assign({}, a, { x: 1, y: 2 });
          登錄后復制

        • 修改現有對象部分的屬性。

          let newVersion = { ...previousVersion, name: 'New Name' // Override the name property };
          登錄后復制

        其他

        • 如果把自定義屬性放在擴展運算符前面,就變成了設置新對象的默認屬性值。
        • 與數組的擴展運算符一樣,對象的擴展運算符后面可以跟表達式。
        • 如果擴展運算符后面是一個空對象,則沒有任何效果。
        • 如果擴展運算符的參數是nullundefined,這兩個值會被忽略,不會報錯。
        • 擴展運算符的參數對象之中,如果有取值函數get,這個函數是會執行的。

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 最新国产成人精品2024| 国产精品人成在线播放新网站| 亚洲韩国精品无码一区二区三区 | 中文成人无字幕乱码精品区| 四虎国产精品免费久久久| 四虎国产精品永久免费网址| 少妇亚洲免费精品| 国产精品单位女同事在线| 国产精品三级在线| 久久精品国产亚洲av麻豆小说 | 久久久久国产精品熟女影院| 精品久久久久一区二区三区| 88久久精品无码一区二区毛片| 2021久久精品国产99国产精品| 亚洲精品国产精品乱码不99| 欧美久久亚洲精品| 精品91自产拍在线观看二区| 四虎成人精品免费影院| 精品久久一区二区| 2020国产精品永久在线| 精品久久8x国产免费观看| 无码国内精品久久人妻| 伊人久久精品无码av一区| 完整观看高清秒播国内外精品资源 | 99久久夜色精品国产网站| 热re99久久精品国产99热| 久久精品免费观看| 精品国产日产一区二区三区 | 亚洲中文久久精品无码ww16 | 91久久福利国产成人精品| 亚洲精品在线观看视频| 亚洲嫩草影院久久精品| 2021最新国产精品一区| 99热热久久这里只有精品68| 99riav国产精品| 国产精品亚洲不卡一区二区三区| 国产精品99爱免费视频| 国产精品内射久久久久欢欢| 精品无码专区亚洲| 日韩欧美国产精品第一页不卡 | 国产精品日日摸夜夜添夜夜添1国产精品va欧美精 |