前端代码规范
1 2 3 4 5
| const item = new Object();
const item = {};
|
为什么? 这样更容易的判断哪些属性使用的简写。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| const anakinSkywalker = 'Anakin Skywalker'; const lukeSkywalker = 'Luke Skywalker';
const obj = { episodeOne: 1, twoJediWalkIntoACantina: 2, lukeSkywalker, episodeThree: 3, mayTheFourth: 4, anakinSkywalker, };
const obj = { lukeSkywalker, anakinSkywalker, episodeOne: 1, twoJediWalkIntoACantina: 2, episodeThree: 3, mayTheFourth: 4, };
|
- 尽量使用对象扩展操作符,而不是用 Object.assign 浅拷贝一个对象。 使用对象的 rest 操作符来获得一个具有某些属性的新对象。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| const original = { a: 1, b: 2 }; const copy = Object.assign(original, { c: 3 }); delete copy.a;
const original = { a: 1, b: 2 }; const copy = Object.assign({}, original, { c: 3 });
const original = { a: 1, b: 2 }; const copy = { ...original, c: 3 };
const { a, ...noA } = copy;
|
- 如果数组有多行,则在开始的时候换行,然后在结束的时候换行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| const arr = [ [0, 1], [2, 3], [4, 5], ];
const objectInArray = [{ id: 1, }, { id: 2, }];
const numberInArray = [ 1, 2, ];
const arr = [[0, 1], [2, 3], [4, 5]];
const objectInArray = [ { id: 1, }, { id: 2, }, ];
const numberInArray = [ 1, 2, ];
|
为什么? 你可以随时添加新的属性或者改变属性的顺序,而不用修改调用方。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| function processInput(input) { return [left, right, top, bottom]; }
const [left, __, top] = processInput(input);
function processInput(input) { return { left, right, top, bottom }; }
const { left, top } = processInput(input);
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| function handleThings(opts) { opts = opts || {}; }
function handleThings(opts) { if (opts === void 0) { opts = {}; } }
function handleThings(opts = {}) { }
|
1 2 3 4 5 6 7 8 9
| function handleThings(opts = {}, name) { }
function handleThings(name, opts = {}) { }
|
- 尽量使用 class. 避免直接操作 prototype .
为什么? class 语法更简洁,更容易推理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| function Queue(contents = []) { this.queue = [...contents]; } Queue.prototype.pop = function () { const value = this.queue[0]; this.queue.splice(0, 1); return value; };
class Queue { constructor(contents = []) { this.queue = [...contents]; } pop() { const value = this.queue[0]; this.queue.splice(0, 1); return value; } }
|
- 不要使用迭代器。 应该使用 JavaScript 的高阶函数代替 for-in 或者 for-of
拥有返回值得纯函数比这个更容易解释。
使用 map() / every() / filter() / find() / findIndex() / reduce() / some() / … 遍历数组, 和使用 Object.keys() / Object.values() / Object.entries() 迭代你的对象生成数组。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| const numbers = [1, 2, 3, 4, 5];
let sum = 0; for (let num of numbers) { sum += num; } sum === 15;
let sum = 0; numbers.forEach((num) => { sum += num; }); sum === 15;
const sum = numbers.reduce((total, num) => total + num, 0); sum === 15;
const increasedByOne = []; for (let i = 0; i < numbers.length; i++) { increasedByOne.push(numbers[i] + 1); }
const increasedByOne = []; numbers.forEach((num) => { increasedByOne.push(num + 1); });
const increasedByOne = numbers.map(num => num + 1);
|
- 把 const 声明的放在一起,把 let 声明的放在一起。
为什么? 这在后边如果需要根据前边的赋值变量指定一个变量时很有用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| let i, len, dragonball, items = getItems(), goSportsTeam = true;
let i; const items = getItems(); let dragonball; const goSportsTeam = true; let len;
const goSportsTeam = true; const items = getItems(); let dragonball; let i; let length;
|
- 使用定义变量的时候把它们放在一个合理的地方。
let 和 const 是块级作用域而不是函数作用域。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| function checkName(hasName) { const name = getName();
if (hasName === 'test') { return false; }
if (name === 'test') { this.setName(''); return false; }
return name; }
function checkName(hasName) { if (hasName === 'test') { return false; }
const name = getName();
if (name === 'test') { this.setName(''); return false; }
return name; }
|