1、塊級作用域 (1)使用let代替var 好處:變數應該只在其聲明的代碼塊內有效;var命令存在變數提升效用,let命令沒有這個問題。 (2)全局常量 在let和const之間,建議優先使用const,尤其是在全局環境,不應該設置變數,只應設置常量。 const優於let有幾個原因。一個是cons ...
1、塊級作用域
(1)使用let代替var
好處:變數應該只在其聲明的代碼塊內有效;var
命令存在變數提升效用,let
命令沒有這個問題。
(2)全局常量
在let
和const
之間,建議優先使用const
,尤其是在全局環境,不應該設置變數,只應設置常量。
const
優於let
有幾個原因。一個是const
可以提醒閱讀程式的人,這個變數不應該改變;另一個是const
比較符合函數式編程思想,運算不改變值,只是新建值,而且這樣也有利於將來的分散式運算;最後一個原因是 JavaScript 編譯器會對const
進行優化,所以多使用const
,有利於提高程式的運行效率,也就是說let
和const
的本質區別,其實是編譯器內部的處理不同。
2、字元串
靜態字元串一律使用單引號或反引號,不使用雙引號。動態字元串使用反引號。
3、解構賦值
const arr = [1, 2, 3, 4];
// bad
const first = arr[0];
const second = arr[1];
// good
const [first, second] = arr;
函數的參數如果是對象的成員,優先使用解構賦值。
// bad
function getFullName(user) {
const firstName = user.firstName;
const lastName = user.lastName;
}
// good
function getFullName(obj) {
const { firstName, lastName } = obj;
}
// best
function getFullName({ firstName, lastName }) {
}
如果函數返回多個值,優先使用對象的解構賦值,而不是數組的解構賦值。這樣便於以後添加返回值,以及更改返回值的順序。
// bad
function processInput(input) {
return [left, right, top, bottom];
}
// good
function processInput(input) {
return { left, right, top, bottom };
}
const { left, right } = processInput(input);
4、對象
對象的屬性和方法,儘量採用簡潔表達法,這樣易於描述和書寫。
var ref = 'some value';
// bad
const atom = {
ref: ref,
value: 1,
addValue: function (value) {
return atom.value + value;
},
};
// good
const atom = {
ref,
value: 1,
addValue(value) {
return atom.value + value;
},
};
5、數組
使用擴展運算符(...)拷貝數組。
// bad
const len = items.length;
const itemsCopy = [];
let i;
for (i = 0; i < len; i++) {
itemsCopy[i] = items[i];
}
// good
const itemsCopy = [...items];
使用 Array.from 方法,將類似數組的對象轉為數組。
const foo = document.querySelectorAll('.foo');
const nodes = Array.from(foo);
6、函數
(1)簡單的、單行的、不會復用的函數,建議採用箭頭函數。如果函數體較為複雜,行數較多,還是應該採用傳統的函數寫法。
(2)不要在函數體內使用 arguments 變數,使用 rest 運算符(...)代替。
function concatenateAll(...args) {
return args.join('');
}
(3)使用預設值語法設置函數參數的預設值。
// bad
function handleThings(opts) {
opts = opts || {};
}
// good
function handleThings(opts = {}) {
// ...
}
7、Map結構
註意區分 Object 和 Map,只有模擬現實世界的實體對象時,才使用 Object。如果只是需要key: value
的數據結構,使用 Map 結構。因為 Map 有內建的遍歷機制。
let ss = new Map([
['a', 1],
['b', 2]
]);
//遍歷方式1
for(let [akey, avalue] of ss) {
console.log(akey + ":" + avalue)
}
//遍歷方式2
for(let item of ss) {
console.log(item[0] + ":" + item[1])
}
//遍歷方式3
for(let [akey, avalue] of ss.entries()) {
console.log(akey + ":" + avalue)
}