ECMAScript 6標(biāo)準(zhǔn)(簡稱ES6)是JavaScript的下一個(gè)版本混巧,在原來的基礎(chǔ)上新增加了很多強(qiáng)大的功能,首先勤揩,在學(xué)習(xí)ES6之前請大家自行升級(jí)自己的瀏覽器咧党,因?yàn)榘姹咎爬系臑g覽器是無法運(yùn)行新版本的JavaScript代碼的。好了陨亡,今天我們來看一下它都有哪些特性傍衡。
`...`: 表示多行字符串,功能類似于\n
alert(`多
行
字
符
串`)负蠕;
Map
JavaScript的對象有個(gè)小問題蛙埂,就是鍵必須是字符串。但實(shí)際上Number或者其他數(shù)據(jù)類型作為鍵也是非常合理的遮糖。為了解決這個(gè)問題绣的,最新的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("史振濤");
說明:由于一個(gè)Key只能對應(yīng)一個(gè)Value惩嘉,所以多次對一個(gè)Key放入Value時(shí)罢洲,后面的Value會(huì)將前面的Value覆蓋。
Set
Set和Map類似文黎,也是Key的集合惹苗,但不存儲(chǔ)value。由于key不能重復(fù)耸峭,所以在Set中沒有重復(fù)的key桩蓉,重復(fù)元素在Set中自動(dòng)被過濾。
var num = new Set([1,2,3,3,"3"]); // 1,2,3,"3"
Set具有以下方法:
add:添加key劳闹,且每次只能傳一個(gè)值
num.add(4); // 1,2,3,"3",4
delete:刪除key
num.add(3); // 1,2,"3",4
iterable
遍歷Array可以采用下標(biāo)循環(huán)触机,遍歷Map和Set就無法使用下標(biāo)。為了統(tǒng)一集合類型玷或,ES6標(biāo)準(zhǔn)引入了新的iterable類型,Array片任、Map和Set都屬于iterable類型偏友,具有iterable類型的集合可以通過for ... of循環(huán)來遍歷。
var a = [1,2,3,4];
for(var x of a){
alert(x); //會(huì)依次彈出1,2,3,4
}
你可能會(huì)有疑問对供,for ... of循環(huán)和for ... in循環(huán)有何區(qū)別位他?
for ... in循環(huán)由于歷史遺留問題,它遍歷的實(shí)際上是對象的屬性名稱产场。一個(gè)Array數(shù)組實(shí)際上也是一個(gè)對象鹅髓,它的每個(gè)元素的索引被視為一個(gè)屬性,當(dāng)我們手動(dòng)給Array對象添加了額外的屬性后京景,for ... in循環(huán)會(huì)將給Array添加的屬性一起遍歷窿冯。
...rest
由于JavaScript函數(shù)允許接收任意個(gè)參數(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開始以便排除前兩個(gè)參數(shù)鄙皇,這種寫法很別扭芜赌,只是為了獲得額外的rest參數(shù),有沒有更好的方法伴逸?為了解決這一問題缠沈,ES6標(biāo)準(zhǔn)引入了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ù)只能寫在最后,前面用...標(biāo)識(shí)洲愤。從運(yùn)行結(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()); // 會(huì)打印11
為解決塊級(jí)作用域,ES6引入了新關(guān)鍵字let悼吱,用let替代var可以申明塊級(jí)作用域的變量:
function add1() {
var sum = 0;
for (let i = 0; i < 10; i++) {
sum += i;
}
i += 1;
return i;
}
console.log(add1()); // 報(bào)錯(cuò)
var和let申明的是變量慎框,如果要申明一個(gè)常量,在ES6之前是不行的后添。ES6標(biāo)準(zhǔn)引入了新的關(guān)鍵字const來定義常量笨枯,const與let都具有塊級(jí)作用域。