折騰了大半年的項目,用的angular折騰快瘋了。 總算有個小結了。正好閑下來為新的項目做準備,學點新的玩意玩玩,以往ES6都沒用過,感覺被大部隊甩好遠了,抓緊跟上大部隊的腳步... 1.利用let和const引入塊級作用域 通過ES6中定義的let關鍵字可以形成僅作用於該塊作用域的局部變數 與le ...
折騰了大半年的項目,用的angular折騰快瘋了。 總算有個小結了。正好閑下來為新的項目做準備,學點新的玩意玩玩,以往ES6都沒用過,感覺被大部隊甩好遠了,抓緊跟上大部隊的腳步...
1.利用let和const引入塊級作用域
通過ES6中定義的let
關鍵字可以形成僅作用於該塊作用域的局部變數
for(let i=0;i<10;i++){
}
console.log(i);//輸出ReferenceError(未定義)
console.log(a);//輸出ReferenceError(未定義),let聲明的變數不會變數提升,規範了代碼先聲明後使用。
let a =2;
let a=3;//error let申明的變數不能重覆定義。
與let
類似const
也能形成塊作用域,不同點在於const聲明的變數為常量,不可改變
if(true){ const a =888; a = 222;//error. const 聲明的變數是常量。不可被修改 } console.log(a);//輸出ReferenceError(未定義)。塊級作用域、 //有一點要註意的是不能改變const類型變數存儲的東西 const person = {}; person.nam = 'Fink'; person = {};//error
2.變數解析與賦值
var [a,b,c] = [1,2,3]; var arr = [1,2,3]; var [a,b,c] = arr; //數量不對應 let [a,b,c] = [1,2]; console.log(a);//1 console.log(b);//2 console.log(c); // undefined //多層數組 let [a,[b,c],d] = [1,[2,3],4]; 1,2,3,4 //多層不對應 let [a,[b,c],d] = [1,[2],3]; console.log(a) //1 console.log(b) //2 console.log(c) //undefined console.log(d) //3 //對應值非數組 let [a,b,c] = 1;//error let [a,b,c] = false;//error 等號右邊必須是可遍歷對象。 //瞭解映射的原理之後,一個很好的應用場景就是交換數值。 let [a,b] = [1,2]; [a,b] = [b,a] //es6在映射賦值中還加入了預設值 let [a,b=2,c] = [1]; console.log(a); //1 console.log(b); //2 console.log(c); // undefined //針對對象的映射賦值 var {a,b} = {a:'1',b:'2'}; console.log(a); //1 console.log(b); //2 根據key查找value //掌握這種方法,可以簡化很多操作。如獲取一個對象的某些屬性 var person = { name:'fink', 'age':23, 'sex':'male' } let {name,age,sex} = person; console.log(name+age+sex); // fink23male
3.增加了模板字元串
let myName = 'Fink'; document.getElementById("app").innerHTML = `wo name is ${myName}`;
//$(變數名) 不僅支持變數,還支持函數表達式
var result = `my name is ${(function(){return 'fink'})()}`;
4.數組的擴展
//1.Array.from();將偽數組對象轉換為真正的數組 //什麼是偽數組對象?具有數組的結構,但不是數組對象,不能使用數組的方法如forEach等 let arr1 = { 'a': 1, 'b': 2, 'c': 3 }; function arr2(){ let a2 = arguments; } let arr3 = document.querySelectAll('div'); //上面三個都是偽數組對象。 'forEach' in arr1; //false let arr = Array.from(arr1);// es5的寫法: var arr = Array.slice.call(arr1); 'forEach' in arr1; //true;返回值是boolean。 //2.Array.find();在數組中檢索第一個匹配到的元素。 // find()參數為一個函數,設置查找條件 let arr = [1,3,5,7]; var result = arr.find(function(value,index,arr){return value >4}); var result2 = arr.find(function(value,index,arr){return value >10}); console.log(result);// 5 console.log(result2); // 沒有找到的時候返回undefined //findIndex()和find()類似,只不過是查找到的結果對應的下標 // 3. Array.fill();給定一個值來替換數組元素。 let arr = [1,2,3,4,5]; arr.fill(5); //[5,5,5,5,5]; // fill 也可以接收三個參數,第二個和第三個參數分別為開始個結束的位置 let arr2 = [1,2,3,4,5,6,7]; arr.fill(5,1,3);//[1,5,5,4,5,6,7];
5.函數增加預設參數。
function show(name,age=23){ console.log(name+","+age) } show('fink'); // fink,23
6.函數新增rest參數(...)。為了不需要使用arguments對象。
function f(v,...vals){
console.log(v);
console.log(vals);
}
f('fink',1,2,3,4,5,6); //temp 1,2,3,4,5,6
//可以看成將arguments轉換為數組,要比arguments更靈活。
// ***需要註意的一點。
function f(...vals,v){}//這種方式會報錯,rest參數後不能再加別的參數
除了在函數中作為rest參數,“ ... ”
本身可以作為一個運算符使用,用處與rest參數剛好相反,是將一個數組轉為用逗號分隔的參數序列,看看慄子:
function add(x,y){ return x + y; }
var arr = [23,12]; add(...arr); //35
Math.max(...[4, 13, 15]) // 等同於Math.max(4, 13, 15);
//結合rest使用 function f(...vals){ vals //[1,2,3] } var arr = [1,2,3]; f(...arr); //當然上面這樣用是多次一舉,轉換為參數再轉回來,目的是為了理解兩者是互為逆操作的
//其它用法 var nodeList = document.querySelectorAll('div');
var array = [...nodeList];
var arr1 = [1,2,3],arr2 = [4,5,6];
var arr3 = [...arr1,...arr2]; //合併數組,在ES5中我們一般是這樣用的arr1.concat(arr2);
7.=>箭頭函數
var f = a =>b //a為參數,b為返回值 //當傳入多個參數或對象時,要用()包裹 var add = (a,b) => a + b //傳入對象 var plus = ({name,age}) => name + age; var person = { name:'Vicfeel', age:23 }; plus(person); //Vicfeel23 //this對象的指向是可變的,但是在箭頭函數中,它是固定的 var show = { init : function(){ document.addEventListener('click',e = >this.doThing(e),false); } , dothing: function(e){ console.log('do something') } }
8.第七種數據類型。Symbol();
該類型通過 Symbol()來創建。(不能使用new)。表示獨一無二的。
9.新的數據結構Set
Set數據結構和數組類似,區別在於Set內元素是唯一不重覆的,Set函數可以接受一個數組(或類似數組的對象)作為參數,用來初始化,可以通過add
方法添加元素
//ES6環境下 //Set的方法 //Set - 構造函數,參數為一個數組 let arr = [1,2,3,3,4,4]; let s = new Set(arr);//Set{1,2,3,4} //add - 添加一個值,返回結構本身 s.add(5); //Set{1,2,3,4,5} s.add(2); //Set{1,2,3,4,5} s.add(6).add(7);//Set{1,2,3,4,5,6,7} //delete - 刪除一個值,返回一個布爾值表明刪除是否成功 s.delete(6); //true,Set{1,2,3,4,5,7} //has - 判斷是否包含該值,返回一個布爾值 let ok = s.has(6);//false,Set{1,2,3,4,5,7} //clear - 清空Set s.clear();//Set{} //Set的屬性 s.size; //0,與數組不同set通過size獲取大小 s.add(5); s.size; //1
Set內元素具有唯一性,因此最直觀的用途便是數組去重,現在我們可以這樣實現數組去重:
function unique(arr){ return [...new Set(arr)]; //...運算符參看ES6系列(二) //或者 return Array.from(new Set(arr)); }
10.新數據結構Map
map一詞本身就有映射的意思,Map數據結構提供了一種完善的鍵值對結構,之所以稱之為完善是相對於之前而言,我們知道JS中的對象Object本身就是一種鍵值對hash結構,然而這種鍵值對確是不完善的。
Object中只能將字元串作為鍵,無法使用對象作為鍵,Map數據結構的提出就是為瞭解決這個問題
//來看一下Map數據結構的基礎用法: //構造函數 var m = new Map(); var p = {name:'vicfeel'}; //添加鍵值對 m.set(p,'val'); //獲取鍵值對 m.get(p); //"val" m.get('name'); //undefined //返回大小 m.size; //1 //重覆添加相同鍵會覆蓋先前的 m.set(p,'newVal'); m.get(p); //"newVal" //利用包含鍵值對的數組初始化Map,相同鍵後面也會覆蓋前面 var arr = [{'name':'vicfeel'},{'age':23},{'age':25}]; var m2 = new Map(arr); m2.get('age'); //25 //判斷是否含有某個鍵 m2.has('name'); //true //刪除某個鍵 m2.delete('name'); m2.has('name'); //false //清空 m2.clear(); m2.size; //0 另外,另外Map數據結構也有一個forEach方法用於遍歷: let m = new Map(); m.set('name','vicfeel').set('age',25); m.forEach(function(val,key,map){ console.log("Key: %s, Value: %s", key, val); //Key: name, Value: vicfeel //Key: age, Value: 25 });
11.Iterator(遍歷器)
ES新提供的遍歷方法for...of
的遍歷方式便是自動尋找該對象的Iterator介面,一些數據結構是預設部署Iterator介面的,包括數組、Set和Map結構、偽數組(比如arguments對象、DOM NodeList對象)、後文的Generator對象,以及字元串,因此這些數據結構是可以直接使用for...of進行遍歷的