前言
在使用 JavaScript 的时候,有时我们会处理大量条件语句,这里有5个技巧帮助我们编写更简洁的条件语句。
一、对多个条件使用 Array.includes
例子:
function condition(fruit) {
if (fruit == 'apple' || fruit == 'banana') {
console.log(fruit);
}
}
上面的例子看起来不错,但如果有更多水果需要判断呢,比如桃子、草莓、橙子等等,我们要用更多的 || 来扩展这个表述吗?
我们可以使用 Array.includes 重写上面的条件
function condition(fruit){
const allFruit = ['apple','banana','peach','Strawberry','orange'];
if(allFruit.includes(fruit)){
console.log(fruit)
}
}
这样做之后,代码看起来更简洁。
二、更少的嵌套,尽早返回
例子:
// 尽早返回不存在的条件 function condition(fruit, quantity) {
const allFruits = ['apple','banana','peach','Strawberry','orange']; if (!fruit) throw new Error('No fruit!'); if (allFruits.includes(fruit)) {
console.log(fruit); if (quantity > 10) {
console.log(quantity);
} }
}
通过反转条件和提早返回,我们可以进一步减少嵌套:
function condition(fruit, quantity) {
const allFruits = ['apple','banana','peach','Strawberry','orange']; if (!fruit) throw new Error('No fruit!'); if (!allFruits.includes(fruit)) return ; console.log(fruit) if (quantity > 10) {
console.log(quantity);
}
}
三、使用默认的函数参数和解构
例子:
function condition(fruit, quantity) {
if (!fruit) return;
const q = quantity || 1; console.log(`We have ${q} ${fruit}!`);
} condition('banana'); // We have 1 banana!
condition('apple', 2); // We have 2 apple!
使用默认参数和解构:
function condition({name} = {}, quantity = 1) {
console.log (name || 'unknown');
} condition(undefined); // unknown
condition({ }); // unknown
condition({ name: 'apple', color: 'red' }); // apple
四、选择 Map 或对象字面量,而不是 Switch 语句
例子:
function condition(color) {
switch (color) {
case 'red':
return ['apple', 'strawberry'];
case 'yellow':
return ['banana', 'pineapple'];
case 'purple':
return ['grape', 'plum'];
default:
return [];
}
} condition(null); // []
condition('yellow'); // ['banana', 'pineapple']
上面的代码似乎没有什么问题,但我发现它相当冗长。同样的结果可以通过对象字面量和更简洁的语法来实现:
对象字面量:
const fruitColor = {
red: ['apple', 'strawberry'],
yellow: ['banana', 'pineapple'],
purple: ['grape', 'plum']
}; function condition(color) {
return fruitColor[color] || [];
}
使用 Map 实现相同效果:
const fruitColor = new Map()
.set('red', ['apple', 'strawberry'])
.set('yellow', ['banana', 'pineapple'])
.set('purple', ['grape', 'plum']); function condition(color) {
return fruitColor.get(color) || [];
}
使用 Array.filter
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 condition(color) {
return fruits.filter(f => f.color == color);
}
五、所有或部分使用 Array.every & Array.some 的条件
例子:
检查所有水果都为红色:
const fruits = [
{ name: 'apple', color: 'red' },
{ name: 'banana', color: 'yellow' },
{ name: 'grape', color: 'purple' }
]; function condition() {
let isAllRed = true; for (let f of fruits) {
if (!isAllRed) break;
isAllRed = (f.color == 'red');
} console.log(isAllRed); // 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'); console.log(isAllRed); // false
}
如果我们想用一行代码来判断任何一个水果是否为红色,我们可以使用 Array.some
const fruits = [
{ name: 'apple', color: 'red' },
{ name: 'banana', color: 'yellow' },
{ name: 'grape', color: 'purple' }
]; function condition() {
const isAnyRed = fruits.some(f => f.color == 'red'); console.log(isAnyRed); // true
}