溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

es6的三個(gè)點(diǎn)是什么

發(fā)布時(shí)間:2022-10-17 09:55:33 來源:億速云 閱讀:244 作者:iii 欄目:web開發(fā)

本篇內(nèi)容介紹了“es6的三個(gè)點(diǎn)是什么”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

es6的三個(gè)點(diǎn)不是函數(shù),而是一種運(yùn)算符。三個(gè)點(diǎn)“...”指的是“擴(kuò)展運(yùn)算符”,可將可迭代對(duì)象展開到其單獨(dú)的元素中;所謂的可迭代對(duì)象就是任何能用for of循環(huán)進(jìn)行遍歷的對(duì)象,例如數(shù)組、字符串、Map、Set、DOM節(jié)點(diǎn)等。

本教程操作環(huán)境:windows7系統(tǒng)、javascript1.8.5版、Dell G3電腦。

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

數(shù)組擴(kuò)展運(yùn)算符

擴(kuò)展運(yùn)算符(spread)是三個(gè)點(diǎn)(...)。它好比 rest 參數(shù)的逆運(yùn)算,將一個(gè)數(shù)組轉(zhuǎn)為用逗號(hào)分隔的參數(shù)序列。擴(kuò)展運(yùn)算符與正常的函數(shù)參數(shù)可以結(jié)合使用,后面也可以放置表達(dá)式,但如果后面是一個(gè)空數(shù)組,則不產(chǎn)生任何效果。

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]

意義

替代函數(shù)的apply方法

由于擴(kuò)展運(yùn)算符可以展開數(shù)組,所以不再需要apply方法,將數(shù)組轉(zhuǎn)為函數(shù)的參數(shù)了。

// ES5 的寫法
Math.max.apply(null, [14, 3, 77])
// ES6 的寫法
Math.max(...[14, 3, 77])

應(yīng)用

  • 復(fù)制數(shù)組


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

  • 合并數(shù)組


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

  • 與解構(gòu)賦值結(jié)合


    // ES5 的寫法
    a = list[0], rest = list.slice(1)
    // ES6 的寫法
    [a, ...rest] = list
  • 注意:如果將擴(kuò)展運(yùn)算符用于數(shù)組賦值,只能放在參數(shù)的最后一位,否則會(huì)報(bào)錯(cuò)。

  • 轉(zhuǎn)換字符串

    擴(kuò)展運(yùn)算符還可以將字符串轉(zhuǎn)為真正的數(shù)組,并且能夠正確識(shí)別四個(gè)字節(jié)的 Unicode 字符。


    'x\uD83D\uDE80y'.length // 4
    [...'x\uD83D\uDE80y'].length // 3

    let str = 'x\uD83D\uDE80y';
    str.split('').reverse().join('') // 'y\uDE80\uD83Dx'
    [...str].reverse().join('')      // 'y\uD83D\uDE80x'

  • 實(shí)現(xiàn)Iterator接口的對(duì)象

    任何 Iterator 接口的對(duì)象(參閱 Iterator 一章),都可以用擴(kuò)展運(yùn)算符轉(zhuǎn)為真正的數(shù)組。

  • Map和Set結(jié)構(gòu)、Generator函數(shù)


    let map = new Map([
    [1, 'one'],
    [2, 'two'],
    [3, 'three'],
    ]);

    let arr = [...map.keys()]; // [1, 2, 3]

    登錄后復(fù)制


    const go = function*(){
     yield 1;
     yield 2;
     yield 3;
    };

    [...go()] // [1, 2, 3]


    • 如果對(duì)沒有 Iterator 接口的對(duì)象,使用擴(kuò)展運(yùn)算符,將會(huì)報(bào)錯(cuò)。

    • Generator 函數(shù)運(yùn)行后,返回一個(gè)遍歷器對(duì)象,因此也可以使用擴(kuò)展運(yùn)算符。

    • 擴(kuò)展運(yùn)算符內(nèi)部調(diào)用的是數(shù)據(jù)結(jié)構(gòu)的 Iterator 接口,因此只要具有 Iterator 接口的對(duì)象,都可以使用擴(kuò)展運(yùn)算符,比如 Map 結(jié)構(gòu)。

對(duì)象的擴(kuò)展運(yùn)算符

概念

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

let { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 };
x // 1
y // 2
z // { a: 3, b: 4 }

注意:

  • 由于解構(gòu)賦值要求等號(hào)右邊是一個(gè)對(duì)象,所以如果等號(hào)右邊是undefinednull,就會(huì)報(bào)錯(cuò),因?yàn)樗鼈儫o法轉(zhuǎn)為對(duì)象。

  • 解構(gòu)賦值必須是最后一個(gè)參數(shù),否則會(huì)報(bào)錯(cuò)。

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


    let obj = { a: { b: 1 } };
    let { ...x } = obj;
    obj.a.b = 2;
    x.a.b // 2
  • 擴(kuò)展運(yùn)算符的解構(gòu)賦值,不能復(fù)制繼承自原型對(duì)象的屬性。


    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

應(yīng)用

  • 擴(kuò)展某個(gè)函數(shù)的參數(shù),引入其他操作。

function baseFunction({ a, b }) {
// ...
}
function wrapperFunction({ x, y, ...restConfig }) {
// 使用 x 和 y 參數(shù)進(jìn)行操作
// 其余參數(shù)傳給原始函數(shù)
return baseFunction(restConfig);
}

  • 取出參數(shù)對(duì)象的所有可遍歷屬性,拷貝到當(dāng)前對(duì)象之中。

let z = { a: 3, b: 4 };
let n = { ...z };
n // { a: 3, b: 4 }

let aClone = { ...a };
// 等同于
let aClone = Object.assign({}, a);

//上面的例子只是拷貝了對(duì)象實(shí)例的屬性,如果想完整克隆一個(gè)對(duì)象,還拷貝對(duì)象原型的屬性,可以采用下面的寫法。
// 寫法一
const clone1 = Object.assign(
Object.create(Object.getPrototypeOf(obj)),
obj
);
// 寫法二
const clone2 = Object.create(
Object.getPrototypeOf(obj),
Object.getOwnPropertyDescriptors(obj)
)

  • 合并兩個(gè)對(duì)象。


    let ab = { ...a, ...b };
    // 等同于
    let ab = Object.assign({}, a, b);


    //如果用戶自定義的屬性,放在擴(kuò)展運(yùn)算符后面,則擴(kuò)展運(yùn)算符內(nèi)部的同名屬性會(huì)被覆蓋掉。
    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 });
  • 修改現(xiàn)有對(duì)象部分的屬性。


    let newVersion = {
    ...previousVersion,
    name: 'New Name' // Override the name property
    };

其他

  • 如果把自定義屬性放在擴(kuò)展運(yùn)算符前面,就變成了設(shè)置新對(duì)象的默認(rèn)屬性值。

  • 與數(shù)組的擴(kuò)展運(yùn)算符一樣,對(duì)象的擴(kuò)展運(yùn)算符后面可以跟表達(dá)式。

  • 如果擴(kuò)展運(yùn)算符后面是一個(gè)空對(duì)象,則沒有任何效果。

  • 如果擴(kuò)展運(yùn)算符的參數(shù)是nullundefined,這兩個(gè)值會(huì)被忽略,不會(huì)報(bào)錯(cuò)。

  • 擴(kuò)展運(yùn)算符的參數(shù)對(duì)象之中,如果有取值函數(shù)get,這個(gè)函數(shù)是會(huì)執(zhí)行的。

“es6的三個(gè)點(diǎn)是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

es6
AI