天天看點

淺談ES6初級文法以及使用

前言

ES6(ECMAScript6)是于2015年6月正式釋出的 JavaScript 語言的标準,而不是你現在在搜尋引擎中搜出來的蔚來 ES6 汽車型号。相信對于所有前端開發者來說已經很熟悉了,ES6 的内容非常多,本文就不一一介紹了。我将主要介紹一些在前端開發中使用到的 ES6 初級文法,本文針對初級前端開發,大佬們可以略過。如果發現文中有不準确的地方歡迎各位指出,同時也歡迎在評論區探讨。那話不多說,我們開始。

let 和 const 指令

let 和 const 大家用的已經很多了,畢竟現在很少看到還有人使用 var 去定義變量。let 和 const 的塊級作用域、不存在變量提升、不允許重複聲明等特點這裡就略過了。下面先來兩個思考題,看看兩個 for 循環會以怎樣的時間間隔在控制到列印出什麼值。

淺談ES6初級文法以及使用

還有一個暫時性死區的概念,暫時性死區是指在代碼塊内如果存在 let 和 const 指令,這個區塊對這些指令聲明的變量,從一開始就形成了封閉作用域,不可以在聲明之前使用這些變量。

需要注意的是,const 指令聲明的複合類型資料(數組和對象)本質上是變量指向的記憶體位址不能改變,這個指針指向的資料結構是可以改變的。是以我們在聲明變量時能用 const 的就一定不使用 let。

淺談ES6初級文法以及使用

解構指派

解構指派的使用場景非常多,字元串、數組、對象以及函數的參數都可以進行解構。這裡就不過多贅述解構的文法了,下面将直接列舉一些案例,文中出現的擴充運算符(...),其實就是取出參數對象中的所有可周遊屬性,拷貝到目前對象之中。

數組的解構指派

數組的結構指派很簡單,你隻要在使用時注意一些細節就行。

淺談ES6初級文法以及使用

對象的解構指派

需要注意的是,對象的解構指派的内部機制,是先找到同名屬性,然後再賦給對應的變量,真正被指派的是後者,而不是前者。

是以當服務端接口傳回的字段名不是我們前端想要的,傲嬌的你又不想改自己的代碼(或者本身這個字段名你已經在很多地方使用了),那麼這個時候就可以使用别名來解構。最後你會看到下圖中我們嘗試列印 node 也報錯了,這也符合對象解構指派的機制。

淺談ES6初級文法以及使用

函數參數的解構指派

函數參數的解構無非就是把數組或者對象當作函數的參數傳入,然後就是跟數組和對象一樣是機制進行解構,下面以傳入對象為例,同樣也可以使用預設值,重命名。

淺談ES6初級文法以及使用

字元串的擴充

ES6 中字元串還是新增了很多 API ,比如 includes(), startsWith(), endsWith(),repeat(), padStart(),padEnd() 等,我覺得使用頻率都不是很高,你隻要知道就行,如果有不清楚的可以自行查閱。那這裡我就重點介紹一下模版字元串了。

模版字元串

模闆字元串(template string)是增強版的字元串,用反引号(`)辨別。它可以當作普通字元串使用,也可以用來定義多行字元串,或者在字元串中嵌入變量。

淺談ES6初級文法以及使用

字元串插入變量和表達式。變量名寫在 ${} 中,${} 中可以放入JavaScript 表達式。

模闆字元串中的換行和空格都是會被保留的。

數組的擴充

ES6 中新增了一些數組的 API ,有些使用頻率也是非常高的。

find()和findIndex()

find() 查找數組中符合條件的元素,若有多個符合條件的元素,則傳回第一個元素。

findIndex( ) 查找數組中符合條件的元素索引,若有多個符合條件的元素,則傳回第一個元素索引。

兩個方法其實幾乎一樣,差別在于 find() 傳回的是符合條件的元素,如果沒有符合條件的元素,則傳回undefined。而 findIndex( ) 傳回的是符合條件的元素索引,如果沒有符合條件的元素,則傳回 -1。這兩個方法被前端經常用來判斷一組資料中是否有符合條件的值,要注意與數組的 indexOf() 和 some() 方法的差別。

淺談ES6初級文法以及使用

find() 和 findIndex( ) 方法的回調函數可以接受三個參數,依次為目前的值、目前的位置和原數組,這裡就不介紹了。這兩個方法都可以接受第二個參數,用來綁定回調函數 this 對象。另外,這兩個方法都可以發現 NaN ,彌補了數組的 indexOf 方法的不足。上面我提到了 some() 方法,其實如果想要判斷數組是否包含某個指定的值 ES6 提出了 includes() 方法,這将更加簡潔明了。

是以當你發現很多數組的方法都能實作你的某一個需求,但是怎麼快速的敲出最好的那個 API ,這就要我們對每個 API 都足夠了解,平時多總結,畢竟讓自己的代碼變得優雅是每位程式員的追求。

includes()

該方法傳回一個布爾值,表示某個數組是否包含給定的值。方法支援兩個參數,第一個參數表示搜尋的值;第二個參表示搜尋的起始位置,預設為0。如果第二個參數為負數,則表示倒數的位置,如果這時它大于數組長度(比如第二個參數為-4,但數組長度為3),則會重置為從0開始。

淺談ES6初級文法以及使用

數組的擴充其實還有其他的内容,我這裡就不介紹了,你可以自己查閱教程。

對象的擴充

屬性簡寫和屬性名表達式

ES6 中對象的屬性簡寫和屬性名表達式大家應該都知道。在上面講到的對象解構指派其實就是一個屬性簡寫。

淺談ES6初級文法以及使用

在開發中一定要注意簡寫的地方,當你在使用某些元件的 API 或者改别人代碼時,要知道哪裡他是使用了簡寫,如果你的變量名有改變就一定要改過來,不然當你看到控制台的報錯你就匪夷所思了,這代碼為什麼之前可以跑?現在為什麼又跑不了?

assign()

ES6新增了一個操作 Object.assign() , 下面列舉三個常見用途。

淺談ES6初級文法以及使用

函數的擴充

函數參數的預設值

ES6 可以直接在參數上設定預設值,這比 ES5 隻能在函數内為參數設定預設值友好得多。具體用法我們其實在上面講 函數參數的解構指派時已經有介紹了。這裡就拿官方的例子列舉一下。

淺談ES6初級文法以及使用

箭頭函數

箭頭函數因其寫法而得名,我們可以用 '=>'去定義函數。

當箭頭函數函數體有多行語句,用 {} 包裹起來,表示代碼塊,當隻有一行語句,并且需要傳回結果時,可以省略 {} , 結果會自動傳回。同樣這裡的 return 簡寫你也要注意,當你函數的代碼塊不止一行時,你就該補上 return 了。

淺談ES6初級文法以及使用

官方給出了幾個使用箭頭函數的注意點:

(1)函數體内的this對象,就是定義時所在的對象,而不是使用時所在的對象。

(2)不可以當作構造函數,也就是說,不可以使用new指令,否則會抛出一個錯誤。

(3)不可以使用arguments對象,該對象在函數體内不存在。如果要用,可以用Rest參數代替。

(4)不可以使用yield指令,是以箭頭函數不能用作Generator函數。

箭頭函數中this 指向的固定化,并不是因為箭頭函數内部有綁定 this 的機制,實際原因是箭頭函數根本沒有自己的 this ,導緻内部的 this 就是外層代碼塊的 this 。正是因為它沒有 this ,是以也就不能用作構造函數。

Set 和 Map 資料解構

Set

ES6 提供了新的資料結構 Set。它類似于數組,但是成員的值都是唯一的,沒有重複的值。它的一些 API 我就直接通過下面的例子說明了

淺談ES6初級文法以及使用

Map

Map 對象儲存鍵值對。任何值(對象或者原始值) 都可以作為一個鍵或一個值。Map 對象在日常的開發中使用的也是非常多,因為 Object 結構提供了“字元串—值”的對應,Map 結構提供了“值—值”的對應,是一種更完善的 Hash 結構實作。如果你需要“鍵值對”的資料結構, Map 比 Object 更合适。

淺談ES6初級文法以及使用

有使用過樂高、低代碼平台的同學知道,在低代碼項目的開發中我們會經常處理複雜的資料,Map 對象基本是必不可少。下面舉個簡單的例子:

淺談ES6初級文法以及使用

這樣我們就将對象中的某個字段值和這個對象本身給聯系起來了,友善我們快速去比對。

最後

那麼關于 ES6 的基...基...基礎就先到這裡了,前面的内容也不是很全面,包括 ES6 的 Class 類、子產品、Promise對象、Generator函數以及 async 函數等這裡就先不介紹了。一方面是我的水準還不足以和大家分享這方面知識,另一方面也是因為每個知識點的内容都很多,适合做專題分享。這裡貼兩個 ES6 教程的連結:

https://es6.ruanyifeng.com/

阮一峰《ECMAScript 6 教程》是一本開源的 JavaScript 語言教程,全面介紹 ECMAScript 6 新引入的文法特性。

https://www.runoob.com/w3cnote/es6-tutorial.html

ES6教程 | 菜鳥教程

當然你要是想要阮一峰老師的《ECMAScript 6 教程》第三版的pdf版電子書,你可以直接釘釘私信我(月杋) 。

繼續閱讀