ES6的新特性:解析賦值
解析賦值是es6引入的新特性,解析賦值擁有很強的靈活性。用的最多的莫過於
import { Component, createElement } from "react";
複製程式碼
類似的語句。
解析賦值通常會在兩個地方使用,一是對陣列的解析賦值
,二是物件的解析賦值
。會寫python
的朋友一定不會對以下程式碼感覺熟悉
[a, b] = [b, a]
複製程式碼
JavaScript
利用解析賦值也能實現同樣的效果,程式碼完全一樣。
本文注重對陣列的解析賦值
進行講述,對於物件的解析賦值
,和import
語法一致,不做過多講。
首先,看下面一個例子
[a, b] = [1, 2, 3]; //a = 1, b = 2;
[a, ...b] = [1, 2, 3];// a = 1, b = [2, 3];
[a, b] = [1, 2]; //a = 1, b = 2;
[a, ...b] = [1, 2]; //a = 1, b =[2]
[a, b] = [1]; //a = 1, b = undefined
[a, ...b] = [1]; // a = 1, b = [];
[a, b] = []; //a = b =undefined;
[a, ...b] = []; // a = undefined, b = []
複製程式碼
上面幾行程式碼基本上就能說明js的解析賦值
的特性了,...b
操作符意思是把剩下的封裝成一個陣列賦值給b。因此你可以看見,...b
都是一個陣列,哪怕它是空的。但是a
就不一樣,因為當右邊陣列是空的時候,a
是無法獲得值的,因此a
在解析失敗的時候,會是undefined
。注意[a, b] = []
這行程式碼,這就很好理解為什麼兩個都是undefined
了。
它能做什麼?
解析賦值
是很強大的一個特性,這裡列舉兩個例子拋磚引玉。
example 1,交換兩個變數
let a = 100, b = 200;
[a, b] = [b, a];
複製程式碼
由於JavaScript是動態語言,因此,a
b
可以是任何型別的,不單單是數字。
example 2: 快速排序
這個例子可謂是解析賦值
的最經典的例子,以前我們實現快速排序,要麼是直接利用Array.prototype.sort
,要麼就是自己封裝一個快速排序的函式。藉助解析賦值
特性,我們可以更加精簡的實現快速排序。話不多說,直接上程式碼
const qsort = ([m, ...xs]) => m == undefined ? [] : [
...qsort(xs.filter(a => a <= m)),
m,
...qsort(xs.filter(a => a > m))
];
qsort([5, 6, 9, 8, 7, 4, 3, 1, 2]); // [1, 2, 3, 4, 5, 6, 7, 8, 9];
複製程式碼
這個例子預設是從小到大的排序,如果要從大到小,只需要修改其中的比較條件即可。怎麼樣,很簡潔吧?
這個例子用到了其他的新特性,比如箭頭函式
.箭頭函式
本身比較簡單,為了內容的完整性,做一個簡單的介紹。
- 箭頭函式和以前的
function() {}
匿名函式其實很相似,兩者的區別在於:
箭頭函式
書寫起來更簡便,不用自己寫return
。比如let fn = xs => xs.filter(a => a < 10)
,這段程式碼中,xs
為一個陣列,它的功能是返回xs
中小於10的數字。只需要這樣呼叫即可fn([1, 2, 3, 10, 11, 12])
。預設情況下,如果函式程式碼不用{}
包圍,那麼直接返回函式本體執行後的值,比如這段程式碼直接返回xs.filter(a => a < 10)
的執行效果,filter
裡面的函式也是一個解釋原因。引數只有一個的時候,可以省略掉括號,比如上面的xs
和a
。箭頭函式
預設的作域(也就是函式本體裡面的this
變數)是當前箭頭函式
所宣告的地方的作用域變數。並且call
和apply
對匿名函式是沒有作用的(第一引數沒用,後面的引數有效)。
寫在最後
es6
的新特性在chrome
firefox
nodejs
中支援已經比較完善了,但是還是有部分瀏覽器無法執行,比如騰訊自家的某某瀏覽器核心和微軟的某某瀏覽器,因此你需要使用babel
進行轉碼。詳細的操作在這裡不給出。另外我推薦各位前端開發人員,儘可能地使用es6的新特性來進行編碼,新的技術應該得到更多的應用。比如Promise
async/await
fetch
之類的全新的特性,這些特性將帶給你不一樣的體驗。