第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

全部開發(fā)者教程

ES6-10 入門教程

ES6+ 展開語法

1. 前言

ES6 新增了 ... 的語法糖,主要用于展開語法和剩余語法中,本節(jié)先來說說展開語法。展開語法顧名思義可以理解為把整體展開成個體,在 ES5 中如果想把一個數(shù)組的內(nèi)容拷貝到另一個數(shù)組中,可以使用 for 循環(huán)數(shù)組的每一項,然后添加到目標(biāo)數(shù)組中去。但是如果使用展開語法就很方便地完成這個操作了。下面我們就來看看展開語法是如何使用的。

2. 從拷貝說起

2.1 數(shù)組拷貝

在 ES5 經(jīng)常會遇到數(shù)組和對象的淺拷貝,我們都知道數(shù)組和對象都是引用類型,所以不能像字符串那樣直接賦值,在 ES5 中數(shù)組和對象的拷貝都是通過循環(huán)來實現(xiàn)的,下面我們來看幾個例子:

var arr1 = [1, 2, 3];
var arr2 = [];
arr1.forEach(function(value){
  arr2.push(value);
}) 
console.log(arr2);	// [1, 2, 3]

上面的代碼是把 arr1 數(shù)組中的項拷貝到 arr2 中去,還可以使用數(shù)組提供的 concat 和 slice 方法來實現(xiàn)。

var arr1 = [1, 2, 3];
var arr2 = [].concat(arr1);
var arr3 = arr1.slice(0);
arr1.push(4)
console.log(arr1); //[1, 2, 3, 4]
console.log(arr2); //[1, 2, 3]
console.log(arr3); //[1, 2, 3]

在拷貝完后,對 arr1 數(shù)組添加元素,可以看到 arr2 和 arr3 沒有發(fā)生變化,說明它們不是一個引用地址。這是 ES5 所提供的拷貝方式,那么 ES6 是如何簡化的呢?

var arr1 = [1, 2, 3]; 
var arr2 = [...arr1];
arr1.push(4)
console.log(arr1);	//[1, 2, 3, 4]
console.log(arr2);	//[1, 2, 3]

使用 ... 展開語法可以實現(xiàn)與上面 ES5 實現(xiàn)的相同效果,而且比較簡潔地表達(dá)了把 arr1 中的每一項展開放入 arr2 中。

2.2 字面量對象拷貝

上面說到了 ES5 和 ES6 數(shù)組拷貝的一個對比,那么針對字面量對象的拷貝二者又是怎么來實現(xiàn)的呢?

ES5 中針對字面量對象的拷貝方式比較少,沒有數(shù)組提供的類似的方法可以使用,只能使用循環(huán),但是還可以使用 JSON.stringifyJSON.parse 來實現(xiàn),但是這個方法存在一些缺陷。 下面看 ES5 中字面量的拷貝實例:

let obj = {a: 1, b: 2};
let copy1 = {};
for(let key in obj) {
  copy1[key] = obj[key] 
}
let copy2 = JSON.parse(JSON.stringify(obj))

上面的兩種方法給出了 ES5 拷貝字面量對象的方法,比較麻煩,也容易出錯。ES6 給出了它的答案:

let obj = {a: 1, b: 2};
let copy = {...obj};

使用展開語法對 obj 進(jìn)行展開,完美地實現(xiàn)了拷貝過程。

Tips: 這里有必要說明一下,以上的方法都是淺拷貝(只拷貝數(shù)組和對象的第一層結(jié)構(gòu))的過程,對于數(shù)組和對象第一層以后的內(nèi)容,如果是引用類型的存儲方式,則不會進(jìn)行拷貝操作,也就是不會進(jìn)行深拷貝。

3. 語法詳情

上面通過拷貝初步了解了展開語法,這里我們給出展開語法的定義:展開語法在函數(shù)調(diào)用和構(gòu)造數(shù)組時,將字符串和數(shù)組在語法層面展開;如果是對象時,將對象的表達(dá)式按照 key-value 的方式展開。展開語法的使用主要有以下幾種:

  • 處理字符串、數(shù)組和字面量對象;
  • 簡化函數(shù)調(diào)用時傳參問題;
  • 代替 apply 方法。

3.1 在字符串中的使用

展開語法在處理字符串時,顧名思義可以把字符進(jìn)行展開,從而得到一個每項都是單個字符串的數(shù)組,注意展開語法在字符串使用時,需要包裹在 [] 中才能生效。

const arr = [...'imooc'];
console.log(arr); // ["i", "m", "o", "o", "c"]

在 ES5 中也有方法,可以使用 split 方法實現(xiàn)把字符串變成數(shù)組。

const arr = 'imooc'.split('');
console.log(arr); // ["i", "m", "o", "o", "c"]

3.2 在數(shù)組中的使用

上面我們講了 ES5 中對一個數(shù)組的拷貝,在數(shù)組的操作中還有添加、合并等操作的時候,需要調(diào)用數(shù)組的 slice ()、concat ()unshift () 等方法,或者組合使用這些方法。

const arr1 = [1, 2];
const arr2 = ['a', ...arr1];
const arr3 = [...arr1, ...arr2];

console.log(arr2);	// ['a', 1, 2]
console.log(arr3);	// [1, 2, 'a', 1, 2]

上面的代碼可以看出,展開語法有很多種不同的使用方式,我們可以把展開語法當(dāng)成一個整體,直接放到想放到的位置上即可,擴(kuò)展了操作數(shù)組的方式。

3.3 在字面量對象中的使用

和數(shù)組一樣,展開語法在字面量對象中的使用方式也有很多種:

const obj1 = {a: 1, b: 2};
const obj2 = {...obj1, c: 30};
console.log(obj2);         // {a:1, b:2, c:30}
const obj3 = {b: 20, c: 30};
const obj4 = {...obj2, ...obj3};  // 合并對象

console.log(obj4);         // {a:1, b:20, c:30}

上面的代碼可以看出,使用方式和數(shù)組基本一致,都是把數(shù)組或?qū)ο笾械拿恳豁椪归_到另一個數(shù)組或?qū)ο笾腥ァ?/p>

3.4 函數(shù)調(diào)用時傳參問題

在函數(shù)調(diào)用時經(jīng)常會向函數(shù)中傳遞參數(shù),但是,當(dāng)我們的參數(shù)是數(shù)組中的項時,我們需要把數(shù)組中的每一項取出來,然后傳入函數(shù)中,這樣顯得很麻煩,能不能有個方式直接把數(shù)組傳入進(jìn)去呢?首先我們看個求和的例子:

function sum(x, y) {
  return x + y;
}
console.log(sum(1, 2)); // 3

const data = [1,2];
console.log(sum(data[0], data[1]));  // 3

上面的 sum 是一個求和函數(shù),接受兩個參數(shù),我們可以在調(diào)用時直接傳遞 2 個參數(shù)。但這個時候我們希望求 data 數(shù)組中的和,這個時候只能取出 data 中的每一項值傳遞到函數(shù)中去,這樣無疑是一個很笨的方法,在 ES5 的時候可以使用 apply() 對函數(shù)進(jìn)行間接的調(diào)用解決這個問題。

function sum(x, y, z) {
  return x + y + z;
}
const data = [1,2,3];
console.log(sum.apply(null, data)); // 6

使用 apply() 的方法是解決了這個問題,但是可能會使我們理解代碼增加了難度。有了 ES6 的展開語法,這個問題就會輕而易舉地解決了。

function sum(x, y, z) {
  return x + y + z;
}
const data = [1,2,3];
console.log(sum(...data)); // 6

上面的方法使用展開語法把 data 數(shù)組中的每一項進(jìn)行展開,成為 sum 函數(shù)中的三個參數(shù)。

4. 小結(jié)

本節(jié)通過數(shù)組和字面量的拷貝引入了 ES6 的展開語法的優(yōu)勢,又說到了在函數(shù)傳參時的應(yīng)用,可以總結(jié)以下幾點(diǎn):

  1. 可以把 ... 加數(shù)組或字面量當(dāng)作數(shù)組或字面量中的一項,任意放入數(shù)組或字面量中不同的位置;
  2. 可以通過展開語法對數(shù)組和字面量進(jìn)行淺拷貝;
  3. 在函數(shù)傳參數(shù)直接把數(shù)組中的項進(jìn)行展開就可以達(dá)到傳遞多個參數(shù)的目的。