變數宣告
const 和 let
不要用 var,而是用 const 和 let,分別表示常量和變數。不同於 var 的函式作用域,const 和 let 都是塊級作用域。
const DELAY = 1000;
let count = 0;
count = count + 1;
複製程式碼
模板字串
模板字串提供了另一種做字串組合的方法。
const user = 'world';
console.log(`hello ${user}`); // hello world
// 多行
const content = `
Hello ${firstName},
Thanks for ordering ${qty} tickets to ${event}.
`;
複製程式碼
預設引數
function logActivity(activity = 'skiing') {
console.log(activity);
}
logActivity(); // skiing
複製程式碼
箭頭函式
函式的快捷寫法,不需要通過 function 關鍵字建立函式,並且還可以省略 return 關鍵字。
同時,箭頭函式還會繼承當前上下文的 this 關鍵字。
比如:
[1, 2, 3].map(x => x + 1); // [2, 3, 4] 等同於: [1, 2, 3].map((function(x) { return x + 1; }).bind(this));
複製程式碼
模組的 Import 和 Export
import 用於引入模組,export 用於匯出模組。
比如:
// 引入全部
import dva from 'dva';
// 引入部分
import { connect } from 'dva';
import { Link, Route } from 'dva/router';
// 引入全部並作為 github 物件
import * as github from './services/github';
// 匯出預設
export default App;
// 部分匯出,需 import { App } from './file'; 引入
export class App extend Component {};
複製程式碼
析構賦值
析構賦值讓我們從 Object 或 Array 裡取部分資料存為變數。
// 物件
const user = { name: 'guanguan', age: 2 };
const { name, age } = user;
console.log(`${name} : ${age}`); // guanguan : 2
// 陣列
const arr = [1, 2];
const [foo, bar] = arr;
console.log(foo); // 1
複製程式碼
我們也可以析構傳入的函式引數。
const add = (state, { payload }) => {
return state.concat(payload);
};
析構時還可以配 alias,讓程式碼更具有語義。
const add = (state, { payload: todo }) => {
return state.concat(todo);
};
複製程式碼
物件字面量改進
這是析構的反向操作,用於重新組織一個 Object 。
const name = 'duoduo';
const age = 8;
const user = { name, age }; // { name: 'duoduo', age: 8 }
複製程式碼
定義物件方法時,還可以省去 function 關鍵字。
app.model({
reducers: {
add() {} // 等同於 add: function() {}
},
effects: {
*addRemote() {} // 等同於 addRemote: function*() {}
},
});
複製程式碼
Spread Operator
Spread Operator 即 3 個點 ...,有幾種不同的使用方法。
可用於組裝陣列。
const todos = ['Learn dva'];
[...todos, 'Learn antd']; // ['Learn dva', 'Learn antd']
也可用於獲取陣列的部分項。
const arr = ['a', 'b', 'c'];
const [first, ...rest] = arr;
rest; // ['b', 'c']
// With ignore
const [first, , ...rest] = arr;
rest; // ['c']
複製程式碼
還可收集函式引數為陣列。
function directions(first, ...rest) {
console.log(rest);
}
directions('a', 'b', 'c'); // ['b', 'c'];
代替 apply。
function foo(x, y, z) {}
const args = [1,2,3];
// 下面兩句效果相同
foo.apply(null, args);
foo(...args);
複製程式碼
對於 Object 而言,用於組合成新的 Object 。(ES2017 stage-2 proposal)
const foo = {
a: 1,
b: 2,
};
const bar = {
b: 3,
c: 2,
};
const d = 4;
const ret = { ...foo, ...bar, d }; // { a:1, b:3, c:2, d:4 }
複製程式碼
此外,在 JSX 中 Spread Operator 還可用於擴充套件 props,詳見 Spread Attributes。
Promises
Promise 用於更優雅地處理非同步請求。比如發起非同步請求:
fetch('/api/todos')
.then(res => res.json())
.then(data => ({ data }))
.catch(err => ({ err }));
複製程式碼
定義 Promise 。
const delay = (timeout) => {
return new Promise(resolve => {
setTimeout(resolve, timeout);
});
};
delay(1000).then(_ => {
console.log('executed');
});複製程式碼