新增數據作用域
在 ES6 之前,JavaScript只有兩種作用域:全局變量與函數內的局部變量。ES6中新增了塊級作用域,使用let
和const
關鍵詞定義。
特點
- 在同一作用作用域內,變量不能重複定義
- 必須先聲明,才能使用(暫時性死區),看如下代碼
let x = 10;
{
console.log(x);
let x = 5;
}
以上代碼會Uncaught ReferenceError: Cannot access 'x' before initialization
錯誤,因爲console.log(x)
執行時會先在當前作用域找x
,如果有x
,則不會去上級作用域找,但是在console.log(x)
語句執行時,x
還沒有定義。
- 聲名的變量不綁定到window對象上。
- 在一對大括號中{},聲名變量時,會產生塊級作用域,變量僅在此塊級作用域中有效。
- const定義一個常量,它一旦定義,值就無法改變,所以在定義時必須賦值。
應用
解決閉包問題
for(var i = 0; i < 10; i++) {
setTimeout(function(){
console.log(i);
},1)
}
//以上代碼會輸出10個10
for(let i = 0; i < 10; i++) {
setTimeout(function(){
console.log(i);
},1)
}
//輸出0-9
新增數據類型
在ES6中新增了一下6中數據類型
- Symbol類型(基本數據類型)
- Set類型
- Map類型
- weakSet類型
- WeakMap類型
- TypedArray類型
Symbol()用法
Symbol()
類型表示獨一無二的值,最大的用法是用來定義對象的唯一屬性名。Symbol 函數棧不能用 new 命令,因爲 Symbol 是原始數據類型,不是對象。可以接受一個字符串作爲參數,爲新創建的 Symbol 提供描述,用來顯示在控制檯或者作爲字符串的時候使用,便於區分。
let sy = Symbol('abc');
console.log(sy); //Symbol(abc)
console.log(typeof sy); //symbol
// 相同參數 Symbol() 返回的值不相等
let sy1 = Symbol('abc');
console.log(sy == sy1);//false
Set() 用法
Set
類型對象允許你存儲任何類型的唯一值,無論是原始值或者是對象引用。它類似於數組,但是他的一大特性就是所有元素都是唯一的,沒有重複。可以利用這一點爲數組去重
let set = new Set([1, 4, 5, 6, 6, 5]);
console.log(set); //Set(4) {1, 4, 5, 6}
//數組轉Set
let arr2 = [12, 3, 43, 2, 3];
let set2 = new Set(arr2);
console.log(set2); //Set(4) {12, 3, 43, 2}
//使用for...of可以用拉力遍歷Set
for(let i of set) {
console.log(i);
}
//1 4 5 6
Map() 用法
Map
Map對象保存鍵值對,任何值(原始值或對象)都可以作爲一個鍵或一個值。Map是一組鍵值對,有key 也有value。
let map = new Map();
map.set('keystr','mymap');
console.log(map); //Map(1) {"keystr" => "mymap"}
console.log(map.get('keystr')); //mymap
//for...of也可以遍歷Map