ES6常用新特性
1. let && const
let 命令也用於變數宣告,但是作用域為區域性
{
let a = 10;
var b = 1;
}
在函式外部可以獲取到b,獲取不到a,因此例如for迴圈計數器就適合使用let。
const用於宣告一個常量,設定後值不會再改變
const PI = 3.1415;
PI // 3.1415
PI = 3; //TypeError: Assignment to constant variable.
2. 解構賦值
ES6 允許按照一定模式,從陣列和物件中提取值,對變數進行賦值,這被稱為解構(Destructuring)。
例如陣列:
let [a, b, c] = [1, 2, 3];
//等同於
let a = 1;
let b = 2;
let c = 3;
這真的讓程式碼看起來更優美,有種python賦值的既視感。
物件的解構賦值:獲取物件的多個屬性並且使用一條語句將它們賦給多個變數。
var {
StyleSheet,
Text,
View
} = React;
等同於
var StyleSheet = React.StyleSheet;
var Text = React.Text;
var View = React.Text;
3. 箭頭函式
ES6中新增箭頭操作符用於簡化函式的寫法,操作符左邊為引數,右邊為具體操作和返回值。
var sum = (num1, num2) => { return num1 + num2; }
//等同於
var sum = function(num1, num2) {
return num1 + num2;
};
箭頭函式還修復了this的指向,使其永遠指向詞法作用域:
var obj = {
birth: 1990,
getAge: function () {
var b = this.birth; // 1990
var fn = () => new Date().getFullYear() - this.birth; // this指向obj物件
return fn();
}
};
obj.getAge(); // 25
4. …操作符
這個的引入幾乎不會用到extend這個函式來。通過它可以將陣列作為引數直接傳入函式:
var people = [`Lily`, `Lemon`, `Terry`];
function sayHello(people1,people2,people3){
console.log(`Hello ${people1},${people2},${people3}`);
}
sayHello(...people);//輸出:Hello Lily,Lemon,Terry
5. iterable型別
為了統一集合型別,ES6標準引入了新的iterable型別,Array、Map和Set都屬於iterable型別,具有iterable型別的集合可以通過新的for … of迴圈來遍歷。
var a = [`A`, `B`, `C`];
var s = new Set([`A`, `B`, `C`]);
var m = new Map([[1, `x`], [2, `y`], [3, `z`]]);
for (var x of a) { // 遍歷Array
alert(x);
}
for (var x of s) { // 遍歷Set
alert(x);
}
for (var x of m) { // 遍歷Map
alert(x[0] + `=` + x[1]);
}
Map相關操作如下, Set同理:
var m = new Map(); // 空Map
m.set(`Adam`, 67); // 新增新的key-value
m.set(`Bob`, 59);
m.has(`Adam`); // 是否存在key `Adam`: true
m.get(`Adam`); // 67
m.delete(`Adam`); // 刪除key `Adam`
m.get(`Adam`); // undefined
6.類
ES6提供了更接近傳統語言的寫法,引入了Class(類)這個概念,作為物件的模板。通過class關鍵字,可以定義類,與多數傳統語言類似。
//定義類
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
toString() {
return `(` + this.x + `, ` + this.y + `)`;
}
}
7.Set
var arr = [1,2,3,3,3,3,14]
var set = new Set(arr)
var arr = Array.from(set)
console.log(arr) // 1,2,3,14
ES7常用新特性
1. Array.prototype.includes
在一個陣列或者列表中檢查是否存在一個值
let arr = [`react`, `angular`, `vue`]
// Correct
if (arr.includes(`react`)) {
console.log(`Can use React`)
}
還能在字串中使用includes:
let str = `React Quickly`
// Correct
if (str.toLowerCase().includes(`react`)) { // true
console.log(`Found "react"`)
}
除了增強了可讀性語義化,實際上給開發者返回布林值,而不是匹配的位置。
includes也可以在NaN(非數字)使用。最後 ,includes第二可選引數fromIndex,這對於優化是有好處的,因為它允許從特定位置開始尋找匹配。
更多例子:
console.log([1, 2, 3].includes(2)) // === true)
console.log([1, 2, 3].includes(4)) // === false)
console.log([1, 2, NaN].includes(NaN)) // === true)
console.log([1, 2, -0].includes(+0)) // === true)
console.log([1, 2, +0].includes(-0)) // === true)
console.log([`a`, `b`, `c`].includes(`a`)) // === true)
console.log([`a`, `b`, `c`].includes(`a`, 1)) // === false)
2.Exponentiation Operator(求冪運算)
et a = 7 ** 12
let b = 2 ** 7
console.log(a === Math.pow(7,12)) // true
console.log(b === Math.pow(2,7)) // true
開發者還可以操作結果:
let a = 7
a **= 12
let b = 2
b **= 7
console.log(a === Math.pow(7,12)) // true
console.log(b === Math.pow(2,7)) // true
ES8新特性
1. Object.values/Object.entries
ES5 引入了Object.keys方法,返回一個陣列,成員是引數物件自身的(不含繼承的)所有可遍歷( enumerable )屬性的鍵名。
Object.values方法返回一個陣列,成員是引數物件自身的(不含繼承的)所有可遍歷( enumerable )屬性的鍵值。
Object.entries方法返回一個陣列,成員是引數物件自身的(不含繼承的)所有可遍歷( enumerable )屬性的鍵值對陣列。
let {keys, values, entries} = Object;
let obj = { a: 1, b: 2, c: 3 };
for (let key of keys(obj)) {
console.log(key); // `a`, `b`, `c`
}
for (let value of values(obj)) {
console.log(value); // 1, 2, 3
}
for (let [key, value] of entries(obj)) {
console.log([key, value]); // [`a`, 1], [`b`, 2], [`c`, 3]
}
2. String padding(字串填充)
3. Async/Await
使用Promise
使用Promise寫非同步程式碼,會比較麻煩:
axios.get(`/q?query=${query}`)
.then(response => response.data)
.then(data =>
{
this.props.processfetchedData(data);
})
.catch(error => console.log(error));
使用Async/Await
Async/Await使得非同步程式碼看起來像同步程式碼,這正是它的魔力所在:
async fetchData(query) =>
{
try
{
const response = await axios.get(`/q?query=${query}`);
const data = response.data;
return data;
}
catch (error)
{
console.log(error)
}
}
fetchData(query).then(data =>
{
this.props.processfetchedData(data)
})
Async/Await是寫非同步程式碼的新方式,以前的方法有回撥函式和Promise。相比於Promise,它更加簡潔,並且處理錯誤、條件語句、中間值都更加方便