ECMAScript 6標準(簡稱ES6)是JavaScript的下一個版本,在原來的基礎(chǔ)上新增加了很多強大的功能,首先,在學(xué)習(xí)ES6之前請大家自行升級自己的瀏覽器,因為版本太古老的瀏覽器是無法運行新版本的JavaScript代碼的。好了,今天我們來看一下它都有哪些特性。
`...`: 表示多行字符串,功能類似于\n
alert(`多
行
字
符
串`);
Map
JavaScript的對象有個小問題,就是鍵必須是字符串。但實際上Number或者其他數(shù)據(jù)類型作為鍵也是非常合理的。為了解決這個問題,最新的ES6規(guī)范引入了新的數(shù)據(jù)類型Map:它是一組鍵值對的結(jié)構(gòu),具有極快的查找速度。
var score = new Map([["惠皎",100],["史振濤",59],["童靜",99]]);
Map具有以下方法:
get:通過鍵名獲取它的值,如果沒有,則返回undefined
score.get("惠皎");
set:添加新的key-value
score.set("余鵬舉",67);
has:查看是否存在key,返回值是true or false
score.has("惠皎");
delete:刪除key
score.delete("史振濤");
說明:由于一個Key只能對應(yīng)一個Value,所以多次對一個Key放入Value時,后面的Value會將前面的Value覆蓋。
Set
Set和Map類似,也是Key的集合,但不存儲value。由于key不能重復(fù),所以在Set中沒有重復(fù)的key,重復(fù)元素在Set中自動被過濾。
var num = new Set([1,2,3,3,"3"]); // 1,2,3,"3"
Set具有以下方法:
add:添加key,且每次只能傳一個值
num.add(4); // 1,2,3,"3",4
delete:刪除key
num.add(3); // 1,2,"3",4
iterable
遍歷Array可以采用下標循環(huán),遍歷Map和Set就無法使用下標。為了統(tǒng)一集合類型,ES6標準引入了新的iterable類型,Array、Map和Set都屬于iterable類型,具有iterable類型的集合可以通過for ... of循環(huán)來遍歷。
var a = [1,2,3,4];
for(var x of a){
alert(x); //會依次彈出1,2,3,4
}
你可能會有疑問,for ... of循環(huán)和for ... in循環(huán)有何區(qū)別?
for ... in循環(huán)由于歷史遺留問題,它遍歷的實際上是對象的屬性名稱。一個Array數(shù)組實際上也是一個對象,它的每個元素的索引被視為一個屬性,當我們手動給Array對象添加了額外的屬性后,for ... in循環(huán)會將給Array添加的屬性一起遍歷。
...rest
由于JavaScript函數(shù)允許接收任意個參數(shù),于是我們就不得不用arguments來獲取所有參數(shù)。
function selectRest(a, b) {
var i, rest = [];
if (arguments.length > 2) {
for (i = 2; i<arguments.length; i++) {
rest.push(arguments[i]);}
}
console.log('a = ' + a);
console.log('b = ' + b);
console.log(rest);
}
為獲取除了已定義參數(shù)a、b之外的參數(shù)不得不用arguments,循環(huán)要從索引2開始以便排除前兩個參數(shù),這種寫法很別扭,只是為了獲得額外的rest參數(shù),有沒有更好的方法?為了解決這一問題,ES6標準引入了rest參數(shù)。上面的函數(shù)可以改寫為:
function selectRest(a,b,...rest){
console.log("a = "+a);
console.log("b = "+b);
console.log(rest);
}
selectRest(1,2,3,4,5,6);

rest參數(shù)只能寫在最后,前面用...標識。從運行結(jié)果可知,傳入的參數(shù)先綁定a和b,多余的參數(shù)以數(shù)組形式交給變量rest,所以,不再需要arguments我們就獲取了全部參數(shù)。
let和const
JavaScript的變量作用域?qū)嶋H上是函數(shù)內(nèi)部,在for循環(huán)等語句塊中無法定義具有局部作用域的變量。
function add() {
var sum = 0;
for (var i = 0; i < 10; i++) {
sum += i;
}
i += 1;
return i;
}
console.log(add()); // 會打印11
為解決塊級作用域,ES6引入了新關(guān)鍵字let,用let替代var可以申明塊級作用域的變量:
function add1() {
var sum = 0;
for (let i = 0; i < 10; i++) {
sum += i;
}
i += 1;
return i;
}
console.log(add1()); // 報錯
var和let申明的是變量,如果要申明一個常量,在ES6之前是不行的。ES6標準引入了新的關(guān)鍵字const來定義常量,const與let都具有塊級作用域。