Es6的那些事

2022-04-25 05:32:00 字數 3166 閱讀 9366

現在看招聘**上的要求,作為前端er~都要熟悉甚至精通(滑稽臉)es6,專案中也經常用,啥let,const,尤其是用react的同學,肯定對解構賦值不會陌生,今天逛**前端的部落格,看到一篇名為es6你可能不知道的事,感覺平時對es6的理解還是太淺了。。。

我學習es6是跟阮一峰老師的教程學習的,真的是巨詳細。

一、let 和 const

不存在變數提公升,let改變了語法行為,所宣告的變數一定要在宣告之後使用否則會報錯

只要使用了let命令,所宣告的變數就繫結了這一區域,不再受外部作用域的影響,區塊中只要使用了const和let命令,就在一開始形成了封閉作用域,凡在宣告之前使用這些變數就會報錯

function bar(x=y, y=2) 

bar() 會報錯

塊級作用域,es5函式只能在塊級作用域和頂層作用域宣告,不能再塊級作用域中宣告

函式宣告語句的行為類似於let。在塊級作用域中相當let

es6 允許在塊級作用域中宣告函式,但是考慮到塊級作用域行為差異太大 ,應該避免在塊級作用域內宣告函式,如果確實需要,也應該寫成函式表示式,而不是函式宣告式,而且只能是在使用大括號的塊級作用域

const命令

const是乙個唯讀的常量,一旦宣告常量的值就不會改變,const只宣告不賦值報錯,宣告的變數也不會提公升,同樣存在暫時性死區,只能在宣告的位置後面使用

本質上並不是變數的值不會改動,而是變數的記憶體位址不會改動,const只能保證指標是固定的,資料解構是不可變的,但是物件本身是可變的

我們平時使用的時候第一印象:let是用來替換var的,常量一般用const(以前這麼理解的請舉手),但其實是const定義的是不可重新定義賦值的值,所以他的應用場景應該很廣,包括常量、配置項以及引用的元件、定義大部分的中間元件,反之就let而言,應用場景會很少,我們只會在loop迴圈中才會用到(而且由於const由於不可以重新賦值的特性,所以可以做更多語法靜態分析方面的優化,從而有更高的執行效率)

二、箭頭函式

我非常喜歡箭頭函式,因為語法簡單,形態優雅

我在在前面寫的關於this的文章中,提到了要注意箭頭函式的this指向,箭頭函式沒有獨立的執行上下文,所以內部引用this物件會直接訪問父級,當年我們用過的中間變數(self, that, me, _that, _me, self...),如果只有乙個引數時,可以省略相應的括號

尤其是在連續的promise鏈式呼叫的過程中,可以使**更加優雅

三、解構賦值

按照一定模式,從陣列和物件中提取值,對變數進行賦值,成為解構賦值

如果解構不成功,會等於undefined

不完全解構賦值。只匹配一部分等號左邊的陣列,解構可以成功

解構賦值右邊如果不是陣列或者說不能遍歷迴圈的解構,報錯

物件的解構賦值的內部賦值機制,先找到同名屬性,再賦給對應的變數,真正被賦值的是後者,而不是同名的屬性

例子

= 

f hello

l world

和陣列一樣,解構也可以用於巢狀解構的物件、

物件的解構可以指定預設值,預設值生效的條件是,物件的屬性值嚴格等於undefined

如果解構失敗,變數的值等於undefined

注意:如果將已經宣告的變數用於解構賦值,必須非常小心

for

example

let x;

=

這樣寫會報錯,因為js引擎將理解成乙個**塊,從而發生語法錯誤,只有不將大括號寫在行首,避免js將其理解成**塊,才能解決這個問題,可以將他寫在乙個圓括號裡

物件的解構賦值,等號左邊可以什麼都不寫,雖然沒有意義,但是語法是對的

es6的規則是,只有可能導致解構的歧義,就不得使用圓括號,所以只要有可能就不在模式中中使用圓括號

不能使用圓括號的情況

變數宣告語句不能使用

函式引數不能使用

賦值語句的模式

解構賦值的用途:

1、交換變數的值 [x, y] = [y, x]

2、可以使用解構賦值返回多個值,返回乙個陣列或者乙個物件,取出值就很方便。就是return 陣列或者物件

3、函式引數的定義,可以方便的將引數和傳入的值對應起來

4、提取json

5、函式引數的預設值

6、遍歷map解構

7、輸入模組的指定載入方式,解構賦值會很清晰

四、promise

promise不只是乙個物件,乙個語法,更是一種非同步程式設計方式的變化

所謂promise,簡單說就是乙個容器,裡面儲存著某個未來才會結束的事件(通常是乙個非同步操作)的結果。從語法上說,promise 是乙個物件,從它可以獲取非同步操作的訊息。promise 提供統一的 api,各種非同步操作都可以用同樣的方法進行處理。

promise物件有以下兩個特點。

(1)物件的狀態不受外界影響。promise物件代表乙個非同步操作,有三種狀態:pending(進行中)、fulfilled(已成功)和rejected(已失敗)。只有非同步操作的結果,可以決定當前是哪一種狀態,任何其他操作都無法改變這個狀態。這也是promise這個名字的由來,它的英語意思就是「承諾」,表示其他手段無法改變。

(2)一旦狀態改變,就不會再變,任何時候都可以得到這個結果。promise物件的狀態改變,只有兩種可能:從pending變為fulfilled和從pending變為rejected。只要這兩種情況發生,狀態就凝固了,不會再變了,會一直保持這個結果,這時就稱為 resolved(已定型)。如果改變已經發生了,你再對promise物件新增**函式,也會立即得到這個結果。這與事件(event)完全不同,事件的特點是,如果你錯過了它,再去監聽,是得不到結果的。

小結:es6還有很多新的特性,比如模板字串,正則擴充套件就不在這具體整理了,es6的內容可能有些瑣碎,所以學習的時候也要有些耐心

參考資料

**前端 es6你不知道的那些事

es6 阮一峰教程

ES6系列 ES6簡介

2015年6月17日,ecmascript的第六個版本正式發布,該版本正式名稱為ecmascript 2015,但通常被稱為ecmascript 6或者es6。瀏覽器對es6的支援情況 es6主要應用於node.js,如果想用在瀏覽器中,就需要使用轉碼器 將es6 轉成es5 這意味著,可以用es6...

ES6系列 詳解ES6中的Map

map類似於物件,都用於儲存key value結構的資料。但是,在傳統的物件上,只能用字串或者symbol來作為鍵名。然而,map與物件最大的差別就在於它可以各種資料型別作為鍵名。map是乙個建構函式,用於例項化例項。const m newmap const o m.set o,content m....

ES6 細化ES6之 物件的擴充套件

物件的屬性 屬性表示法es6 允許在大括號裡面,直接寫入變數和函式,作為物件的屬性和方法 es5 let name 張無忌 function sayme es5定義物件的屬性和方法的方式 var obj console.log obj.name 張無忌es6 let name 張無忌 functio...