http://kangax.github.io/compat-table/es5/
http://kangax.github.io/compat-table/es6/git
IE10以上,Chrome、FireFox、移動端、NodeJS
brower.js
var
的缺陷:var a = 1; var a = 2;
PI
let、const
的特性{}
對函數的簡寫es6
() => { }
參數
, ()
能夠省略return
這一行代碼, {}
能夠省略let show = a => a * 2; alert(show(1));
...
... + 數組名 = 數組名[0] ,數組名[1] ,數組名[2], ..,數組名[length-1] }
,做爲參數時互相轉換...args
必須是最後一個參數function show(a, b, ...args) { alert(a); alert(b); alert(args); //3,4,5 args是一個數組 } show(1, 2, 3, 4, 5)
function show(a, b, c) { alert(a); alert(b); alert(c); } let arr = [1, 2, 3] //show(1, 2, 3) show(...arr)
function show(a, b = 2, c = 3) { alert(a) alert(b) alert(c) } show(1,5)
[]
和JSON字符串{}
賦值
,賦值
也很關鍵let [a, b] = [1, [2]]; //同時聲明數組a、b而且賦值 console.log(a, b); // 1, [2]
相比數組寫法,左邊是a、b
右邊也必須是 a 和 b
,寫法:a: + 值
和 b: + 值
。若是是 c: + 值
和 d: + 值
,那麼 a
、b
的值爲
undefind
,至關於只是聲明瞭a和b
github
let {a, b, c} = {a: 1, b: [2],c: {c: 3}}; console.log(a, b, c); // 1, [2], {c: 3}
let [{a, b} ,[c, d], e] = [{a: 1,b: 2}, ['3', ['d']],'e'] console.log(a, b, c, d, e); // 1 2 "3" ["d"] "e"
錯誤1:只能是[]
中包含{}
,否則無法寫,會報錯,由於最外層就決定了最大的基調是變量 : 值
的形式,[b]
的變量不知道是什麼ajax
let {a,[b]} = {a: 1, :[2]]}; //報錯 console.log(a, b);
總結:左邊聲明多個變量,右邊用不一樣寫法爲變量賦值,能夠賦值任意類型
錯誤2:json
let [a, b] = {a: 1 ,b: 2} // 結構不一樣 報錯 Uncaught TypeError: {(intermediate value)(intermediate value)} is not iterable let [a, b] = [a: 1 ,b: 2] // 寫法錯誤 報錯 Uncaught SyntaxError: Unexpected token : let {a, b} = {1 , 2} // 寫法錯誤 Uncaught SyntaxError: Unexpected token ,
錯誤3:聲明和賦值不在一塊兒數組
let [a, b]; // 沒有這樣的聲明變量方式 [a, b] = {a: 1 ,b: 2} // Uncaught SyntaxError: Missing initializer in destructuring declaration
arr
調用map函數的數組thisValue
在函數體中的thisvar array = [1, 2, 3]; var thisValue = '4'; var newArray = array.map(function(value, index, arr){ return (value + '-' + index + '-' + this + '-' + arr) },thisValue) console.log(newArray); // ["1-0-4-1,2,3", "2-1-4-1,2,3", "3-2-4-1,2,3"]
result
做爲每次的返回值thisValue
初始值,做爲循環value
的值//求和 var array = [1, 2, 3]; var thisValue = 4; var newArray = array.reduce(function(result, value, index, arr){ return result + value; //下一次執行函數時,`result`參數的值 },thisValue) //thisValue //第一次執行函數,`result`參數的值 console.log(newArray); // 10
thisValue
,函數中this指代var array = [1, 2, 3]; var thisValue = 4; var newArray = array.filter(function(value, index, arr) { return value > 1 ? true : false; }, thisValue) console.log(newArray); // [2, 3]
var array = [1, 2, 3]; var thisValue = 4; array.forEach(function(value, index, arr) { console.log(value + '-' + this + '-' + arr); // 1-4-1,2,3 // 2-4-1,2,3 // 3-4-1,2,3 }, thisValue)
startsWith(str[, position])
包含
開始位置的地方開始比較var str = 'abcd'; console.log(str.startsWith('a', 0)); //true console.log(str.startsWith('a', 1)); //false
endsWith(str[, position])
不包含
末尾位置的地方開始var str = 'abcd'; console.log(str.endsWith('d', 0)); //true console.log(str.endsWith('d', 4)); //false 默認str.length
+
${}`let str = 'abcd' let str1 = `${str}ef g h` console.log(str1); //abcdef //g // h 輸出也有一個空格
class
function Book(title) { this.title = title; } Book.prototype = { constructor: Book, showTitle: function() { console.log(this.title) } } var book = new Book('ES6'); book.showTitle(); //ES6
constructor
初始化屬性function
關鍵字class Book{ constructor(title){ this.title = title; } showTitle(){ console.log(this.title) } } let book = new Book('ES2015') book.showTitle(); //ES2015
執行父類的構造函數,使子類繼承父類的屬性和方法promise
function MyBook(title, name) { Book.call(this, title); this.name = name; } MyBook.prototype = new Book(); MyBook.prototype.constructor = MyBook; MyBook.prototype.showName = function() { console.log(this.name); } var myBook = new MyBook('ES6', 'wangcf'); myBook.showTitle(); //ES6 myBook.showName(); //wangc
class Book { constructor(title) { this.title = title; } showTitle() { console.log(this.title) } } class MyBook extends Book { constructor(title, name) { super(title); //執行父類的構造函數 this.name = name; } showName() { console.log(this.name) } } let myBook = new MyBook('ES2015', '張三') myBook.showTitle(); //ES2015 myBook.showName(); //張三
let obj = { a: 1, b: '2' } let json = JSON.stringify(obj) console.log(json); // {"a":1,"b":"2"}
let a = 1; let b = 2; let json = { a: a, b: b }; let json1 = { a, b }; console.log(json); //{a: 1, b: 2} console.log(json1); //{a: 1, b: 2}
:function
舊寫法異步
let obj = { a: 1, show: function(){ console.log(this.a); } } obj.show(); // 1
新寫法模塊化
let obj = { a: 1, show(){ console.log(this.a); } } obj.show(); // 1
不適用於解決下一個回調依賴上一次結果的狀況
適用一次性執行多個請求,各請求之間無關
用同步的方式書寫異步代碼函數
Promise.race 哪一個快就執行resolve
let p = new Promise(function(resolve, reject){ //異步代碼 //成功:resolve //失敗:reject if(true){ resolve('成功'); }else{ reject('失敗') } }) p.then(function(data){ console.log(data); },function(data){ console.log(data); }) // 成功
let p1 = new Promise(function(resolve, reject) { if (true) { resolve('成功1'); } else { reject('失敗1') } }) let p2 = new Promise(function(resolve, reject) { if (true) { resolve('成功2') } else { reject('失敗2') } }) Promise.all([p1, p2]).then(function(arr) { //返回值是一個數組,順序保存多個Promise返回值 console.log('p1和p2所有resolve'); let [data1, data2] = [arr[0], arr[1]]; console.log(data1 + data2); }, function(data) { //有一個失敗就當即進入,不會繼續執行其餘Promise console.log('p1和p2其中有一個reject'); console.log(data); })
function createPromise(num) { return new Promise(function(resolve, reject) { if (true) { resolve('成功' + num); } else { reject('失敗1' + num); } }) } Promise.all([ createPromise(1), createPromise(2) ]).then(function(arr) { //返回值是一個數組,順序保存多個Promise返回值 console.log('p1和p2所有resolve'); let [data1, data2] = [arr[0], arr[1]]; console.log(data1 + data2); }, function(data) { //有一個失敗就當即進入,不會繼續執行其餘Promise console.log('p1和p2其中有一個reject'); console.log(data); })
完美解決下一個回調依賴上一次執行結果的狀況
函數組成部分:*
和yield
,建立generator
對象
通常函數:一直執行到完
generator函數:能夠在中間暫停,執行使用generatro.next
function *show(){ console.log(1) //1 yield; // 暫停 console.log(2) //沒有next則不執行這段子函數 } let gen = show(); //gen.next(); gen.next(); //執行到yield暫停
將函數分割成多個子函數
function* show(num) { console.log(num); //5 console.log(1); //1 let y = yield 7; //y獲取第一個子函數的結果,第一個子函數的返回值 console.log(2); //2 console.log(y) //4 console.log(num) //5 return 6; //最後一個子函數依賴return返回 } let gen = show(5); //第一個子函數的參數在這裏傳遞 let res1 = gen.next(3); let res2 = gen.next(4); //第二個next傳參才能夠接收 console.log(res1) //{value: 7, done: false} console.log(res2) //{value: 6, done: true}
引用runner和jQuery文件
runner(function *(){ let data1 = yield $.ajax(url: xxx, dataType: 'json'); let data2 = yield $.ajax(url: xxx, dataType: 'json'); let data3 = yield $.ajax(url: xxx, dataType: 'json'); })