1.多重判断时使用 Array.includes
function test(fruit) { const redFruits = ['apple', 'strawberry', 'cherry', 'cranberries']; if (redFruits.includes(fruit)) { //if (fruit == 'apple' || fruit == 'strawberry') { console.log('red');
}
}
2.更少的嵌套,尽早 Return
/_ 当发现无效语句时,尽早Return _/ function test(fruit, quantity) { const redFruits = ['apple', 'strawberry', 'cherry', 'cranberries']; // 条件 1: 尽早抛出错误 if (!fruit) throw new Error('No fruit!'); // 条件 2: 当fruit不是apple时停止继续执行 if (!redFruits.includes(fruit)) return; console.log('red'); // 条件 3: 必须是大质量的 if (quantity > 10) { console.log('big quantity'); } } // 测试结果 test(null); // error: No fruits test('apple'); // print: red test('apple', 20); // print: red, big quantity
3.使用默认参数和解构
默认值:
function test(fruit, quantity = 1) { // 如果 quantity 参数没有传入,设置默认值为 1 if (!fruit) return; console.log(`We have ${quantity} ${fruit}!`); } //test results test('banana'); // We have 1 banana! test('apple', 2); // We have 2 apple!
如果fruit
是一个object
// 解构 - 仅仅获取 name 属性 // 为其赋默认值为空对象 function test({name} = {}) { console.log (name || 'unknown'); } // test results test(undefined); // unknown test({ }); // unknown test({ name: 'apple', color: 'red' }); // apple
这是一个使用Lodash的例子:
function test(fruit) { // 获取属性名,如果属性名不可用,赋默认值为 unknown console.log(__.get(fruit, 'name', 'unknown'); } // test results test(undefined); // unknown test({ }); // unknown test({ name: 'apple', color: 'red' }); // apple
4.倾向于对象遍历而不是Switch语句
function test(color) { // 使用条件语句来寻找对应颜色的水果 switch (color) { case 'red': return ['apple', 'strawberry']; case 'yellow': return ['banana', 'pineapple']; case 'purple': return ['grape', 'plum']; default: return []; } } // test results test(null); // [] test('yellow'); // ['banana', 'pineapple']
上面的代码看起来没有错误,但是我找到了一些累赘。用对象遍历实现相同的结果,语法看起来更简洁:
const fruitColor = { red: ['apple', 'strawberry'], yellow: ['banana', 'pineapple'], purple: ['grape', 'plum'] }; function test(color) { return fruitColor[color] || []; }
或者你也可以使用 Map实现相同的结果:
const fruitColor = new Map() .set('red', ['apple', 'strawberry']) .set('yellow', ['banana', 'pineapple']) .set('purple', ['grape', 'plum']); function test(color) { return fruitColor.get(color) || []; }
5.重构语法:
const fruits = [ { name: 'apple', color: 'red' }, { name: 'strawberry', color: 'red' }, { name: 'banana', color: 'yellow' }, { name: 'pineapple', color: 'yellow' }, { name: 'grape', color: 'purple' }, { name: 'plum', color: 'purple' } ]; function test(color) { return fruits.filter(f => f.color == color); } test('red'); //[{ name: 'apple', color: 'red' },{ name: 'strawberry', color: 'red' }]
6.对 所有/部分 判断使用Array.every & Array.some
检查是否所有水果都是红色:
const fruits = [ { name: 'apple', color: 'red' }, { name: 'banana', color: 'yellow' }, { name: 'grape', color: 'purple' } ]; function test() { let isAllRed = true; // 条件:所有水果都是红色 for (let f of fruits) { if (!isAllRed) break; isAllRed = (f.color == 'red'); } return isAllRed; } test() ; // false
通过 Array.every
减少代码行数:
const fruits = [ { name: 'apple', color: 'red' }, { name: 'banana', color: 'yellow' }, { name: 'grape', color: 'purple' } ]; function test() { const isAllRed = fruits.every(f => f.color == 'red'); return isAllRed; } test(); // false
想测试是否存在红色的水果:
const fruits = [ { name: 'apple', color: 'red' }, { name: 'banana', color: 'yellow' }, { name: 'grape', color: 'purple' } ]; function test() { // 条件:任何一个水果是红色 const isAnyRed = fruits.some(f => f.color == 'red'); return isAnyRed; } test(); // true