ES7新特性:
在Es6的基礎上增長了三項:求冪運算符(**),Array.prototype.includes()方法、函數做用域中嚴格模式的變動。
(1)Array.prototype.include(). 查找一個值在不在數組裏;接收兩個參數:要搜索的值和搜索的開始索引。當第二個參數被傳入時,該方法會從索引處開始日後搜索(默認索引值爲0)。若搜索值在數組中存在則返回true,不然返回false。
與indexOf相比較:
更加簡便(從返回值來講一個是下標一個是值)
精確性:兩個NaN被認爲是相等的,即便在NaN === NaN結果是false的狀況下。這一點和indexOf()的行爲不一樣,indexOf()嚴格使用===判斷。
let demo = [1, NaN, 2, 3]
demo.indexOf(NaN) //-1
demo.includes(NaN) //true
includes()只能判斷簡單類型的數據,對於複雜類型的數據,好比對象類型的數組,二維數組,這些,是沒法判斷的
(2)求冪運算符(**)
3 ** 2 //9。 等同於 Math.pow(3,2); let a = 3; a **= 2 //9
Es8新特性:
(1)異步函數(Async functions)
因爲javascript語言的執行環境是單線程的,通常使用回調函數實現異步編程,假若有多個嵌套的話,代碼顯得很亂;
Promise,將函數的嵌套改爲鏈式調用;.then(()=>回調方法);
promise的缺點是:請求任務過多時.then也會相對增長;
Generator:異步編程機制,在dva中effects中就是使用的這種;函數執行時,返回的是一個指向內部狀態的指針對象,必須調用遍歷器對象的next方法,使得指針移向下一個狀態。也就是說,每次調用next方法,內部指針就從函數頭部或上一次停下來的地方開始執行,直到遇到下一個yield表達式(或return語句)爲止。換言之,Generator 函數是分段執行的,yield表達式是暫停執行的標記,而next方法能夠恢復執行。
function* helloWorldGenerator() {
yield 'hello';
yield 'world';
return 'ending';
}
var hw = helloWorldGenerator();
hw.next()
// { value: 'hello', done: false }
hw.next()
// { value: 'world', done: false }
hw.next()
// { value: 'ending', done: true }
hw.next()
// { value: undefined, done: true }
缺點:流程管理不方便;
async function asyncFunc(params) {
const result1 = await this.login()
const result2 = await this.getInfo()
}
變體
異步函數存在如下四種使用形式:
* 函數聲明: async function foo() {}
* 函數表達式: const foo = async function() {}
* 對象的方式: let obj = { async foo() {} }
* 箭頭函數: const foo = async () => {}
並行處理多個異步結果:
async function asyncFunc() {
const [result1, result2] = await Promise.all([
otherAsyncFunc1(),
otherAsyncFunc2()
]);
console.log(result1, result2);
}
async function asyncFunc() {
try {
await otherAsyncFunc();
} catch (err) {
console.error(err);
}
}
(2)Object.entries()和Object.values()
將一個具備鍵值對的數據結構或是數組,返回一個二維數組;
Object.entries({ one: 1, two: 2 }) //[['one', 1], ['two', 2]]
Object.entries([1, 2]) //[['0', 1], ['1', 2]]注意:鍵值對中,若是鍵的值是Symbol,編譯時將會被忽略。例如:
Object.entries({ [Symbol()]: 1, two: 2 }) //[['two', 2]]
進行對象屬性的遍歷:
let obj = { a: 1, b: 2 };
for (let [k,v] of Object.entries(obj)) {
console.log(`${JSON.stringify(k)}: ${JSON.stringify(v)}`);
}
//輸出結果以下:
'a': 1
'b': 2
Object.values():工做原理和上面很像,只返回鍵值對中屬性值;返回數組順序也和上面很像;
Object.values({ one: 1, two: 2 }) //[1, 2]
Object.values({ 3: 'a', 4: 'b', 1: 'c' }) //['c', 'a', 'b']
(3)字符串填充:padStart和padEnd
padStart函數經過填充字符串的首部來保證字符串達到固定的長度,反之,padEnd是填充字符串的尾部來保證字符串的長度的。該方法提供了兩個參數:字符串目標長度和填充字段,其中第二個參數能夠不填,默認狀況下使用空格填充。
'Vue'.padStart(10) //' Vue'
React'.padStart(10, 'Hello') //'HelloReact'
填充函數只有在字符長度小於目標長度時纔有效,若字符長度已經等於或小於目標長度時,填充字符不會起做用,並且目標長度若是小於字符串自己長度時,字符串也不會作截斷處理,只會原樣輸出。
(4)Object.getOwnProentyDescriptors()指定屬性描述符;
該方法會返回目標對象中全部屬性的屬性描述符,該屬性必須是對象本身定義的,不能是從原型鏈繼承來的;第二個參數能夠是
該方法返回的描述符,會有兩種類型:數據描述符、存取器描述符。返回結果中包含的鍵可能的值有:configurable、enumerable、value、writable、get、set;
使用過Object.assign()的同窗都知道,assign方法只能拷貝一個屬性的值,而不會拷貝它背後的複製方法和取值方法。Object.getOwnPropertyDescriptors()主要是爲了解決Object.assign()沒法正確拷貝get屬性和set屬性的問題。
http://www.cnblogs.com/zhuanzhuanfe/p/7493433.html。原文地址;
ES7與ES6相比較而言,二者更加貼近,在ES6基礎上作修改。而ES8添加更多的新特性,經過他人的博客瞭解還不夠透徹,只是把精華部分摘取出來,本身理解的比較少;