新增塊級作用域
塊級作用域是指聲明的變量無法被代碼塊的外部訪問到,此也稱之爲詞法作用域, 它可以在: 函數內部和代碼塊內部創建.
塊級作用域允許任意嵌套.
塊級作用域完美替代了匿名立即執行函數表達式
ES6中塊級作用域必須具有大括號,沒有大括號則JS引擎認爲不存在塊級作用域
變量聲明
在ES6中,共有六種聲明變量的方法: var, function, let, const, import和class命令,由於ES5中,有var和function, 本文不再贅述,import和class將在後文中詳細介紹。
let: let聲明的變量會將其限制在當前的作用域中,也就是說,它具有塊級作用域, 在該作用域外,將無法訪問.
報錯提示: ReferenceError
const: const聲明一個只讀常量,一旦聲明, 常量的值就不能改變.需要初始化賦值
報錯提示:TypeError/SyntaxError語法錯誤
說明:
const所保證的是變量所指向的那個內存地址所保存的數據不得改動。對於簡單類型的數據,值就存在變量指向的那個內存地址,因此等同於常量。但對於複合型的數據(對象,數組),變量指向的是內存地址,保存的是一個指向實際數據的指針,const
只能保證這個指針是固定的,至於指向的數據結構則不可保證不變。
總結:
- 在let和const聲明前的區域稱爲暫時性死區, 意味着就是隻要變量在還沒聲明前使用,就會報錯.
- let和const不會出現變量提升, 變量提升, 即變量可以在聲明之前使用,值爲undefined.
- let和const不允許出現重複聲明
循環中的塊級綁定
在for循環體中, 使用let聲明變量, 該變量僅在本輪的循環中有效, 所以每次循環中變量都是一個全新的變量.另外一個特別之處就是,設置循環變量的部分是父作用域,而循環體內是一個單獨的子作用域.如下:
for (let i = 0; i<3; i++) {
let i = '123';
console.log(i);
}
//123
//123
//123
塊級作用域與函數聲明
ES6中,允許在塊級作用域中聲明函數,在ES6的瀏覽器中,函數的聲明語句類似於var, 即會提升到全局作用域或函數作用域的頭部, 而其他環境中, 將塊級作用域的函數聲明當作let處理, 在塊級作用域之外不可引用。
**注意:**由於環境導致的行爲差異較大,應避免在塊級作用域中聲明函數, 可用函數表達式來代替。
頂層對象的屬性
頂層對象,它提供了全局環境即全局作用域。
在瀏覽器環境中,指的是window對象,在Node指的是global對象。
在ES6中,全局變量將逐步與頂層對象的屬性脫鉤。也就是說,使用let和const等聲明的變量和常量不再是window的屬性。 也就是說通過window.a是無法訪問到的。
字符串的擴展
- ES6加強了對Unicode的支持,允許使用
\uxxxx
形式表示一個字符,其中xxxx
表示字符的Unicode碼點,這種表示法僅限於碼點在\u0000~\uFFFF
之間的字符,超出這個範圍的字符,必須用兩個雙字節的形式表示。ES6中將碼點放入到大括號內,可以正確讀取超過碼點範圍的字符。 - 字符串的遍歷器接口,字符串可以用
for...of
循環遍歷,並且可以識別大於0xFFFF
的碼點 JSON.stringify()
:如果遇到0xD800到0xDFFF之間的單個碼點,或者不存在的配對形式,它會返回轉義字符串,留給應用自己決定下一步的處理。- 模板字符串,用反引號(`)來進行標識,它可以當作普通的字符串使用,也可以來定義多行字符串或者在字符串中嵌入變量。
console.log(`string text line 1
string text line 2`);
let func = (name) => `Hello ${name}!`;
func('Jack') // "Hello Jack!"
- 標籤模板
標籤模板:模板字符串的功能可以緊跟在一個函數名的後面,該函數將被調用用來處理這個模板字符串
字符串的新增方法
String.fromCodePoint()
,在ES6中,該方法可以識別大於0xFFFF
的字符,彌補了ES5中String.fromCharCode()
方法中的不足。String.raw()
,返回一個斜槓都被轉義的字符串,往往用於模板字符串的處理方法。codePointAt()
:能夠正確處理4個字節存儲的字符,返回一個字符的碼點。其參數是字符在字符串中的位置(從0開始),返回的是碼點的十進制,若想轉化爲十六進制,則使用toString()
轉化一下。這個方法可以用來測試一個字符由兩個字節還是由四個字節組成的最簡單方法。normalize()
:用來將字符的不同表示方法統一爲同樣的形式,這稱爲 Unicode 正規化。它可以接受一個參數來指定normalize
的方式,分別爲:
1)NFC
, 默認參數,表示“標準等價合成”,返回多個簡單字符的合成字符。
2)NFD
, 表示“標準等價分解”,即在標準等價的前提下,返回合成字符分解的多個簡單字符。
3)NFKC
,表示“兼容等價合成”,返回合成字符。
4)NFKD
,表示“兼容等價分解”,記載兼容等價的前提下,返回合成字符分解的多個簡單字符。
注意:normalize
方法目前不能識別三個或三個以上字符的合成。includes(), startsWith(), endsWith()
JavaScript中有indexOf()方法,用來確定一個字符串是否包含在另一個字符串中。在ES6中,又提供了另外的三種方法
1)includes()
:返回布爾值,表示是否找到了參數字符串
2)startsWith()
:表示參數字符串是否在原字符串的頭部
3)endsWith()
:表示參數字符串是否在原字符串的尾部
以上三種方法還支持第二個參數,表示開始搜索的位置。repect()
:返回一個新的字符牀,表示將原字符串重複n
次。
參數是非負數,否則將會報錯,小數會被取整。NaN
等同於0。padStart(),padEnd()
:補全字符串的長度
1)padStart(x, y)
:用於頭部補全,其中 x爲字符串補全生效的最大長度,y是用來補全的字符串。
2)padEnd(x, y)
:用於尾部補全,其中 x爲字符串補全生效的最大長度,y是用來補全的字符串。
注意:如果原字符串的長度,等於或大於最大長度,則字符串補全不生效,返回原字符串;如果用來補全的字符串與原字符串,兩者的長度之和超過了最大長度,則會截去超出位數的補全字符串。忽略第二個參數,默認使用空格補全長度。trimStart(),trimEnd()
:
trimStart()
消除字符串頭部的空格,tab 鍵、換行符等不可見的空白符號。
trimEnd()
消除尾部的空格tab 鍵、換行符等不可見的空白符號。它們返回的都是新字符串,不會修改原始字符串。瀏覽器還部署了額外的兩個方法,trimLeft()
是trimStart()
的別名,trimRight()
是trimEnd()
的別名。
數值的擴展
- 二進制和八進制表示法:用前綴
0b
(或0B
)和0o
(或0O
)表示,若將0b
和0o
前綴的字符串數值轉爲十進制,要使用Number
方法。 Number.isFinite()
和Number.isNaN()
Number.isFinite()
用來檢查一個數值是否爲有限的(finite),即不是Infinity。參數類型不是數值的,返回值均爲false。Number.isNaN()
用來檢查一個值是否爲NaN。參數類型不是NaN,Number.isNaN
一律返回false。
-
Number.parseInt(), Number.parseFloat()
:與全局方法使用一致 -
Number.isInteger()
:用來判斷一個數值是否爲整數。JavaScript 內部,整數和浮點數採用的是同樣的儲存方法,所以 25 和 25.0 被視爲同一個值。如果參數不是數值,Number.isInteger返回false。如果對數據精度的要求較高,不建議使用Number.isInteger()判斷一個數值是否爲整數。 -
Number.EPSILON
:表示 1 與大於 1 的最小浮點數之間的差。實質上它是一個可以接受的最小誤差範圍。 -
安全整數和
Number.isSafeInteger()
1)安全整數範圍在-2^53 到 2^53之間(不含兩個端點)
2)Number.MAX_SAFE_INTEGER
和Number.MIN_SAFE_INTEGER
這兩個常量,用來表示這個範圍的上下限。
3)Number.isSafeInteger()
用來判斷一個整數是否落在這個範圍之內,注意:驗證運算結果是否落在安全整數的範圍內,不要只驗證運算結果,而要同時驗證參與運算的每個值。 -
Math對象的擴展
1)Math.trunc
方法用於去除一個數的小數部分,返回整數部分。對於非數值,該方法內部使用Number方法將其轉爲數值。
對於空值和無法截取整數的值,返回NaN。
2)Math.sign()
方法用來判斷一個數到底是正數、負數、還是零。對於非數值,會先將其轉換爲數值。- 參數爲正數,返回+1;
- 參數爲負數,返回-1;
- 參數爲 0,返回0;
- 參數爲-0,返回-0;
- 其他值,返回NaN。
3)
Math.cbrt
方法用於計算一個數的立方根。對於非數值,Math.cbrt方法內部也是先使用Number方法將其轉爲數值。
4)Math.clz32()
方法將參數轉爲 32 位無符號整數的形式,然後返回這個 32 位值裏面有多少個前導 0。
5)Math.imul
方法返回兩個數以 32 位帶符號整數形式相乘的結果,返回的也是一個 32 位的帶符號整數。
6)Math.fround
方法返回一個數的32位單精度浮點數形式。
7)Math.hypot
方法返回所有參數的平方和的平方根。如果參數不是數值,Math.hypot方法會將其轉爲數值。只要有一個參數無法轉爲數值,就會返回 NaN。
8)Math.expm1(x)
返回 ex - 1,即Math.exp(x) - 1。
9)Math.log1p(x)
方法返回1 + x的自然對數,即Math.log(1 + x)。如果x小於-1,返回NaN。
10)Math.log10(x)
返回以 10 爲底的x的對數。如果x小於 0,則返回 NaN。
11)Math.log2(x)
返回以 2 爲底的x的對數。如果x小於 0,則返回 NaN。
12)ES6 新增了 6 個雙曲函數方法。- Math.sinh(x) 返回x的雙曲正弦
- Math.cosh(x) 返回x的雙曲餘弦
- Math.tanh(x) 返回x的雙曲正切
- Math.asinh(x) 返回x的反雙曲正弦
- Math.acosh(x) 返回x的反雙曲餘弦
- Math.atanh(x) 返回x的反雙曲正切
13)指數運算符(
**
):這個運算符的一個特點是右結合,而不是常見的左結合。多個指數運算符連用時,是從最右邊開始計算的。指數運算符可以與等號結合,形成一個新的賦值運算符(**=
)。