新聞中心
本篇內(nèi)容介紹了“es6的三個點是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!
為信陽等地區(qū)用戶提供了全套網(wǎng)頁設計制作服務,及信陽網(wǎng)站建設行業(yè)解決方案。主營業(yè)務為成都網(wǎng)站制作、網(wǎng)站建設、信陽網(wǎng)站設計,以傳統(tǒng)方式定制建設網(wǎng)站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
es6的三個點不是函數(shù),而是一種運算符。三個點“...”指的是“擴展運算符”,可將可迭代對象展開到其單獨的元素中;所謂的可迭代對象就是任何能用for of循環(huán)進行遍歷的對象,例如數(shù)組、字符串、Map、Set、DOM節(jié)點等。
本教程操作環(huán)境:windows7系統(tǒng)、javascript1.8.5版、Dell G3電腦。
擴展操作符 … 是ES6中引入的,將可迭代對象展開到其單獨的元素中,所謂的可迭代對象就是任何能用for of循環(huán)進行遍歷的對象,例如:數(shù)組(數(shù)組常用方法)、字符串、Map (悟透Map)、Set (Set 如何使用?)、DOM節(jié)點等。
數(shù)組擴展運算符
擴展運算符(spread)是三個點(...
)。它好比 rest 參數(shù)的逆運算,將一個數(shù)組轉(zhuǎn)為用逗號分隔的參數(shù)序列。擴展運算符與正常的函數(shù)參數(shù)可以結(jié)合使用,后面也可以放置表達式,但如果后面是一個空數(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方法
由于擴展運算符可以展開數(shù)組,所以不再需要apply
方法,將數(shù)組轉(zhuǎn)為函數(shù)的參數(shù)了。
// ES5 的寫法
Math.max.apply(null, [14, 3, 77])
// ES6 的寫法
Math.max(...[14, 3, 77])
應用
復制數(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注意:如果將擴展運算符用于數(shù)組賦值,只能放在參數(shù)的最后一位,否則會報錯。
轉(zhuǎn)換字符串
擴展運算符還可以將字符串轉(zhuǎn)為真正的數(shù)組,并且能夠正確識別四個字節(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'實現(xiàn)Iterator接口的對象
任何 Iterator 接口的對象(參閱 Iterator 一章),都可以用擴展運算符轉(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]登錄后復制
const go = function*(){
yield 1;
yield 2;
yield 3;
};
[...go()] // [1, 2, 3]如果對沒有 Iterator 接口的對象,使用擴展運算符,將會報錯。
Generator 函數(shù)運行后,返回一個遍歷器對象,因此也可以使用擴展運算符。
擴展運算符內(nèi)部調(diào)用的是數(shù)據(jù)結(jié)構(gòu)的 Iterator 接口,因此只要具有 Iterator 接口的對象,都可以使用擴展運算符,比如 Map 結(jié)構(gòu)。
對象的擴展運算符
概念
對象的解構(gòu)賦值用于從一個對象取值,相當于將目標對象自身的所有可遍歷的(enumerable)、但尚未被讀取的屬性,分配到指定的對象上面。所有的鍵和它們的值,都會拷貝到新對象上面。
let { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 };
x // 1
y // 2
z // { a: 3, b: 4 }
注意:
由于解構(gòu)賦值要求等號右邊是一個對象,所以如果等號右邊是
undefined
或null
,就會報錯,因為它們無法轉(zhuǎn)為對象。解構(gòu)賦值必須是最后一個參數(shù),否則會報錯。
解構(gòu)賦值的拷貝是淺拷貝,即如果一個鍵的值是復合類型的值(數(shù)組、對象、函數(shù))、那么解構(gòu)賦值拷貝的是這個值的引用,而不是這個值的副本。
let obj = { a: { b: 1 } };
let { ...x } = obj;
obj.a.b = 2;
x.a.b // 2擴展運算符的解構(gòu)賦值,不能復制繼承自原型對象的屬性。
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
應用
擴展某個函數(shù)的參數(shù),引入其他操作。
function baseFunction({ a, b }) {
// ...
}
function wrapperFunction({ x, y, ...restConfig }) {
// 使用 x 和 y 參數(shù)進行操作
// 其余參數(shù)傳給原始函數(shù)
return baseFunction(restConfig);
}
取出參數(shù)對象的所有可遍歷屬性,拷貝到當前對象之中。
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);
//如果用戶自定義的屬性,放在擴展運算符后面,則擴展運算符內(nèi)部的同名屬性會被覆蓋掉。
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)有對象部分的屬性。
let newVersion = {
...previousVersion,
name: 'New Name' // Override the name property
};
其他
如果把自定義屬性放在擴展運算符前面,就變成了設置新對象的默認屬性值。
與數(shù)組的擴展運算符一樣,對象的擴展運算符后面可以跟表達式。
如果擴展運算符后面是一個空對象,則沒有任何效果。
如果擴展運算符的參數(shù)是
null
或undefined
,這兩個值會被忽略,不會報錯。擴展運算符的參數(shù)對象之中,如果有取值函數(shù)
get
,這個函數(shù)是會執(zhí)行的。
“es6的三個點是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!
新聞標題:es6的三個點是什么
文章路徑:http://fisionsoft.com.cn/article/pijihs.html