1、let和consthtml
一、let
(1)let所聲明的變量,只在命令所在的代碼塊內有效;
(2)let所聲明的變量,在域解析的時候不會被提高,即:聲明變量前,不可被調用;
(3)let不容許在同一個做用域下聲明已經存在的變量;
(4)在for循環語句以內是一個父做用域;在循環體內是一個子做用域;兩者相互分離,互不干涉。編程
二、const
(1)const所聲明的變量,只在命令所在的代碼塊內有效;
(2)const所聲明的變量,在域解析的時候不會被提高,即:聲明變量前,不可被調用;
(3)const不容許在同一個做用域下聲明已經存在的變量;
(4)const聲明的變量必須賦值;
(5)const聲明的常量存儲簡單的數據類型的時候不可改變其值;若是存儲的是對象,那麼引用不可被改變,至於對象裏面的數據如何變化,是沒有關係的。canvas
學習網址:http://blog.csdn.net/u014695532/article/details/51814984segmentfault
2、變量的解構賦值數組
一、數組的結構賦值:變量的取值由位置決定
二、對象的解構賦值:變量名與屬性名一一對應,次序不重要
三、基本類型解構賦值:null/undefined不能進行解構賦值數據結構
學習網址:http://www.cnblogs.com/Gary-Guoweihan/p/5822937.html閉包
3、數據結構Setapp
一、集合的概念
集合是由一組無序且惟一的項組成,相似於數組,但沒有重複的值。
特色:key和value相同,沒有重複的value。
二、如何建立一個Set:const s = new Set([1,2,3]);
三、Set的屬性:s.size = 3;
四、Set類的方法
(1)add(value)添加一個數據,返回set結構自己;s.add(「value」)
(2)delete(value)刪除指定數據,返回一個布爾值,表示刪除是否成功;
(3)has(value)判斷該值是否爲Set成員,返回一個布爾值;
(4)clear()清除全部數據,沒有返回值;
(5)keys()返回鍵名的遍歷器;
(6)values()返回鍵值的遍歷器;
(7)Entries()返回鍵值對的遍歷器;
(8)ForEach()使用回調函數遍歷每一個成員:
s.forEach(function(value,key,set){ });
異步
學習網址:http://www.cnblogs.com/diligenceday/p/5479076.html模塊化
五、set不容許有重複數據,如何利用set爲數組進行去重?
var array = [1,2,3,4,2,2,5]; var set = new Set(array); array = Array.from(set); //注:Array.from()方法從一個相似數組或可迭代的對象中建立一個新的數組實例。
學習網址:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/from
爲數組去重:http://www.javashuo.com/article/p-kfscjbiw-dp.html
4、數據結構Map(字典類型)
一、字典:是用來存儲不重複key的hash結構;不一樣於集合(set)的是,字典使用的是[鍵,值]的形式來儲存數據的。
二、如何建立一個Map
Const map = new Map([ [‘a’:1], [‘b’:2] ]);
三、Map類的屬性map.size = 2;
四、Map類的方法
(1)set(key,value)
:設置鍵名key對應的鍵值爲value,而後返回整個Map結構,若是key已經有值,則鍵值會被更新,不然就新生成改鍵。
map.set(「key」,」value」).set(「key2」,」value2」).set(「key」,」value3」); //注:key對應的鍵值最終爲value3
(2)get(key)讀取key對應的鍵值,若是找不到key,返回undefinded
map.get(「key」);=====>value3
(3)delete(key) 刪除某個鍵,返回true。若是刪除失敗,返回false
map.delete(「key」);=====>true
(4)has(key) 方法返回一個布爾值,表示某個鍵是否存在當前Map對象之中
map.has(「key2」);=====>true map.has(「key」);=====>false
(5)clear() 清除全部數據,沒有返回值;
(6)keys()返回鍵名的遍歷器;
(7)values()返回鍵值的遍歷器;
(8)Entries()返回鍵值對的遍歷器;
(9)ForEach()使用回調函數遍歷每一個成員:map.forEach(function(value,key,map){ });
//注:map屬於地址存值,裏面的key的排列順序是按照添加順序進行排列的。
學習網址:http://www.jb51.net/article/110048.htm
5、iterator和for-of循環
一、iterator是一種接口,爲各類不一樣的數據結構提供統一的訪問機制,任何數據結構只要部署iterator接口,就能夠完成遍歷操做,並且這種遍歷操做是依次處理該數據結構的全部成員。
二、iterator遍歷器的做用:
(1)爲各類數據結構,提供一個統一的、簡便的訪問接口;
(2)使得數據結構的成員可以按某種次序排列;
(3)ES6新增了遍歷命令for..of循環,iterator接口主要供for..of消費。
三、手寫iterator接口
Const arr = [1,2,3]; Function iterator(arr){ let index = 0; return{ next:function(){ return index < arr.length ? {value : arr[index++], done : false} : {value : undefined, done : true}; } } } Const it = iterator(arr); Console.log(it.next());====>1 Console.log(it.next());====>2 Console.log(it.next());====>3 Console.log(it.next());====>undefined
學習網址:http://www.cnblogs.com/sker/p/5520518.html
四、凡是具有symbol.iterator
屬性的數據結構都具有iterator接口
五、凡是具有iterator接口的數據結構均可以進行以下操做:解構賦值+擴展運算符
如何給一個不具有iterator接口的數據結構部署一個iterator接口?
6、class的基本使用
一、原型鏈
Class miaov{ Constructor(a,b){ This.a = a; This.b = b; Return this; } Print(){ Console.log(this.a + ‘ ’ + this.b ); } }; Const miaov = new miaov(「hello」,」world」).print();
二、miaov中的constructor方法是構造方法,this關鍵字則表明實例對象,也就是說,ES5的構造函數miaov,對應ES6的miaov這個類的構造方法;
三、miaov這個類除了構造方法,還定義了一個print方法:注意,定義「類」的方法的時候,前面不須要加上function這個關鍵字,直接把函數定義放進去了就能夠了。另外,方法之間不須要逗號分隔,加了會報錯;
四、構造函數的prototype屬性,在ES6的「類」上面繼續存在,並且類的全部方法都定義在類的prototype屬性上面;
五、定義在「類」中的方法都是不能夠枚舉的。
Console.log(object.keys(miaov.prototype));
六、constructor方法是類的默認方法,經過new命令生成對象實例時,自動調用該方法,一個類必須有constructor方法,若是沒有顯示定義,一個空的constructor方法會被默認添加;
生成類的實例對象的寫法,與ES5徹底同樣,也是使用new命令。若是忘記加上new,像函數那樣調用class,將會報錯;
7、class的繼承相關知識(canvas畫布實現小球自由落體運動)
一、extends、static、super
經過extends繼承父類,經過super()傳遞參數
8、Symbol數據類型
一、什麼是Symbol?
(1)Symbol表示獨一無二的值,它是js中的第七種數據類型
(2)js數據類型:
基本數據類型:Symbol、string字符串、number數字、boolean布爾、array數組、Null、Undefined
引用數據類型:object對象
二、建立symbol數據類型值
Let sl = Symbol();
//注:Symbol函數前不能使用new,不然會報錯,緣由在於Symbol是一個原始類型的值,不是對象。
三、Symbol參數
Let s2 = Symbol(「a」); //a就是Symbol的參數 //Symbol函數讀取一個字符串做爲參數,表示對Symbol的描述,主要是爲了在控制檯顯示,或者轉爲字符串的時候,比較容易區分。
四、Symbol數據類型的轉換
String(Symbol(「miaov」)); //轉換成字符串 Symbol(「leo」).toString(); //轉換成字符串 !!Symbol(); //true值 //注:Symbol不能使用任何運算符進行運算
五、做爲對象的屬性名
//注:不能被for...in...循環遍歷
9、內置對象的擴展
一、字符串的擴展
模板字符串:
(1)字符串放在反引號當中(tab上的爲反引號) (2)<span> ${ ‘首頁’ } </span> (3)支持三目運算
二、repeat
Let str1 = ‘a’; Let str2 = str1.repeat(3); //輸出aaa
三、includes()、startsWith()、endsWith() //返回true/false
四、數組的擴展
//轉換成數組:Array.from()、Array.of()、find()、findIndex()【函數】、fill() Array.from(); //轉換成數組 Array.of(1); //輸出[1] Let res = arr.find(function(){ })
五、對象的擴展
(1)對象的簡潔表示法:
(2)Object.is(+0,-0); //返回false
(3)Object.assign():用於對象的合併,將源對象的全部可枚舉屬性,複製到目標對象,例:Object.assign(目標對象,源對象,源對象);
10、函數的擴展
一、爲函數參數指定默認值
function fn(a=10,b=20){}; Fn(0,10);
二、函數的rest參數
Rest 參數形式爲(「...變量名」),用於獲取函數的多餘參數,這樣就不須要使用arguments對象了,rest參數搭配的變量是一個數組,該變量將多餘的參數放入數組中。
Function sum(a,...arr){ //其中,...arr爲rest參數 }
三、箭頭函數:使用「箭頭」(=>)定義函數
Const fn = a => a; //調用fn(1),輸出1 Const fn = (a,b) => a+b; //調用fn(1,2),輸出3 (3)Const fn = (a,b) => { a = a *2; b = b *2; return a+b; } //調用fn(1,2),輸出6 (4)const fn = (a,b) => ({a,b}); //調用fn(1,2),輸出一個對象{a:1,b:2}
注意:
(1)箭頭函數體內沒有本身的this對象,因此在使用的時候,其內部的this就是定義時所在環境的對象,而不是使用時所在環境的對象;不能給箭頭函數使用call、apply、bind去改變其內部的this指向;
(2)箭頭函數體內沒有arguments對象,若是要用,能夠用rest參數代替;
例:const fn = (...arr) => arr; //調用fn(1,2,3,4),輸出1,2,3,4
(3)不能夠當作構造函數,不可使用new命令,不然會拋出一個錯誤;
(4)箭頭函數不能當作Generator函數。
11、異步操做之Promise
一、基本概念
Promise: 是ES6中新增的異步編程解決方案,體如今代碼中它是一個對象,能夠經過Promise構造函數來實例化。
new Promise(cb) //===>實例的基本使用, //三種狀態:Pending(進行中) Resolved (已完成)Rejected(已失敗),狀態一旦改變就不會更改。
兩個原型方法:
//----Promise.prototype.then() //----Promise.prototype.catch()
兩個經常使用的靜態方法:
//----Promise.all() //----Promise.resolve() //例: const p = new Promise(function(resolve,reject){ Const img = new Image(); Img.src = imgs[0]; Img.onload = function(){ resolve(this); }; Img.onerror = function(){ reject(new Error(‘圖片加載失敗’)); }; }); p.then(function(img){ //處理成功時執行的回調函數 $(「body」).append(img); }).catch(function(err){ //捕獲失敗時的異常 console.log(err); })
//封裝函數: Function loadImg(url){ const p = new Promise(function(resolve,reject){ Const img = new Image(); Img.src = url; Img.onload = function(){ resolve(this); }; Img.onerror = function(){ reject(new Error(‘圖片加載失敗’)); }; }); return p; }
二、Promise.all()能夠將多個Promise實例包裝成一個新的Promise實例
(1)當全部Promise實例的狀態都變成resolved,Promise.all的狀態纔會變成resolved,此時返回值組成一個數組,傳遞給then中的resolve函數;
(2)只要其中一個被rejected,Promise.all的狀態就變成rejected,此時第一個被reject的實例的返回值,會傳遞給p的回調函數。
//例: const allDone = Promise.all([loadImg(imgs[0]),loadImg(imgs[1]),loadImg(imgs[2])]); allDone.then(function(datas){ //執行成功時的回調函數 }).catch(function(err){ Console.log(err); //捕獲失敗時的異常 })
三、Promise.resolve()
(1)參數是Promise實例,將不做任何修改,原封不動地返回這個實例。
//例: Promise.resolve(lloadImg(imgs[0])).then(function(img){ $(「body」).append(img); })
(2)將對象轉爲Promise對象,而後就當即執行thenable對象的then方法
//例: Promise.resolve({ then(resolve,reject){ const img = new Image(); Img.src = imgs[1]; Img.onload = function(){ resolve(this); } } }).then(function(img){ $(「body」).append(img); })
(3)參數是一個基本數據類型或者不傳參數,那麼返回一個狀態爲resolved的Promise對象。
//例: Promise.resolve(‘miaov’).then(function(str){ Console.log(str); }) //或者 const p = Promise.resolve(); //console.log(p),輸出一個狀態爲resolved的 Promise對象。
12、ES6是如何實現模塊化的?
ES6原生支持模塊化了,經過自帶的export(導出)和import(導入)來實現。
一、傳統的模塊模式基於閉包,返回「公有API」;
二、export的使用方法
方式一:
export function fn() { // 導出函數 } export var num = 42; // 導出變量 var arr = [1,2,3]; export { arr };
方式二:
function fn() { } var num = 42; var arr = [1,2,3]; export {fn,num,arr}; //統一導出
三、import的使用方法
若是想導入一個模塊的API中的特定命名成員到頂層做用域,使用如下語法:
import { foo, bar, baz } from "foo";
ps: 這裏的{ .. }語法可能看起來像一個對象字面量,甚至是像一個對象解構語法。可是,它的形式僅對模塊而言是特殊的,因此不要將它與其餘地方的{ .. }模式搞混了。
被羅列的標識符foo,bar和baz必須匹配在模塊的API上的命名導出(這裏將會發生靜態分析和錯誤斷言)。它們在你當前的做用域中被綁定爲頂層標識符。
import { foo } from "foo"; foo();
能夠重命名被導入的綁定標識符,就像:
import { foo as theFooFunc } from "foo"; theFooFunc();