1. 常用条件判断

1.1 逻辑运算符

使用JavaScript逻辑运算符进行判断。

  1. 1 === 1 // true | 相等
  2. 1!== 1 // false | 不等
  3. 1 < 1 // false | 小于
  4. 1 > 1 // false | 大于
  5. 1 <= 1 // true | 小于或等于
  6. 1 >= 1 // true | 大于或等于
  7. 1 == 1 && 1 == 2 // false | 与运算、两边的条件符合成立
  8. 1 == 1 || 1 == 2 // true | 或运算、一边条件符合即成立

1.2 if 语句

if 条件语句的几种形态。

  1. // if
  2. if (true) {
  3. // 执行
  4. }
  5. // if else
  6. if (1>2) {
  7. } else {
  8. // 执行
  9. }
  10. // else if
  11. if (1>2) {
  12. } else if (1<2) {
  13. // 执行
  14. } else {
  15. }

1.3 switch 语句

if 之外的另一种条件判断语句。

  1. var n = 1
  2. switch(n) {
  3. case 1:
  4. // n = 1 执行
  5. break;
  6. case 2:
  7. // n = 2 执行
  8. break;
  9. default:
  10. // n 既不等于 1 也不等于 2 执行
  11. }

2.优化逻辑判断

2.1 嵌套层级优化

下面的条件判断,存在三层 if 条件嵌套

  1. function supply(fruit, quantity) {
  2. const redFruits = ['apple', 'strawberry', 'cherry', 'cranberries'];
  3. // 条件 1: 水果存在
  4. if (fruit) {
  5. // 条件 2: 属于红色水果
  6. if (redFruits.includes(fruit)) {
  7. console.log('红色水果');
  8. // 条件 3: 水果数量大于 10 个
  9. if (quantity > 10) {
  10. console.log('数量大于 10 个');
  11. }
  12. }
  13. } else {
  14. throw new Error('没有水果啦!');
  15. }
  16. }

提前return无效条件

如果提前 return 掉无效条件,将 if else 的多重嵌套层次减少到一层,更容易理解和维护

  1. function supply(fruit, quantity) {
  2. const redFruits = ['apple', 'strawberry', 'cherry', 'cranberries'];
  3. if (!fruit) throw new Error('没有水果啦'); // 条件 1: 当 fruit 无效时,提前处理错误
  4. if (!redFruits.includes(fruit)) return; // 条件 2: 当不是红色水果时,提前 return
  5. console.log('红色水果');
  6. // 条件 3: 水果数量大于 10 个
  7. if (quantity > 10) {
  8. console.log('数量大于 10 个');
  9. }
  10. }

2.2 多条件分支的优化处理

当需要枚举值处理不同的业务分支逻辑时,第一反应是写下 if else ?我们来看一下:

  1. function pick(color) {
  2. // 根据颜色选择水果
  3. if (color === 'red') {
  4. return ['apple', 'strawberry'];
  5. } else if (color === 'yellow') {
  6. return ['banana', 'pineapple'];
  7. } else if (color === 'purple') {
  8. return ['grape', 'plum'];
  9. } else {
  10. return [];
  11. }
  12. }

在上面的实现中:

  • if else 分支太多
  • if else 更适合于条件区间判断,而 switch case 更适合于具体枚举值的分支判断

改用switch case

  1. function pick(color) {
  2. // 根据颜色选择水果
  3. switch (color) {
  4. case 'red':
  5. return ['apple', 'strawberry'];
  6. case 'yellow':
  7. return ['banana', 'pineapple'];
  8. case 'purple':
  9. return ['grape', 'plum'];
  10. default:
  11. return [];
  12. }
  13. }

switch case 优化之后的代码看上去格式整齐,思路很清晰,但还是很冗长。继续优化:

Object{ key: value } 结构优化

借助 Object 的 { key: value } 结构,我们可以在 Object 中枚举所有的情况,然后将 key 作为索引,直接通过 Object.key 或者 Object[key] 来获取内容。

  1. const fruitColor = {
  2. red: ['apple', 'strawberry'],
  3. yellow: ['banana', 'pineapple'],
  4. purple: ['grape', 'plum'],
  5. }
  6. function pick(color) {
  7. return fruitColor[color] || [];
  8. }
  1. const condition = 2
  2. let obj = {
  3. '1' : () => { document.write(1) },
  4. '2' : () => { document.write(2) },
  5. '3' : () => { document.write(3) },
  6. }
  7. obj[condition]()

使用 Map 数据结构,真正的 (key, value) 键值对结构

  1. const fruitColor = new Map()
  2. .set('red', ['apple', 'strawberry'])
  3. .set('yellow', ['banana', 'pineapple'])
  4. .set('purple', ['grape', 'plum']);
  5. function pick(color) {
  6. return fruitColor.get(color) || [];
  7. }

优化之后,代码更简洁、更容易扩展。

使用 Array.filter 达到同样的效果

为了更好的可读性,还可以通过更加语义化的方式定义对象,然后使用 Array.filter 达到同样的效果。

  1. const fruits = [
  2. { name: 'apple', color: 'red' },
  3. { name: 'strawberry', color: 'red' },
  4. { name: 'banana', color: 'yellow' },
  5. { name: 'pineapple', color: 'yellow' },
  6. { name: 'grape', color: 'purple' },
  7. { name: 'plum', color: 'purple' }
  8. ];
  9. function pick(color) {
  10. return fruits.filter(f => f.color == color);
  11. }

2.3 多条件分支判断

编码时遇到多个判断条件时,本能的写下下面的代码(其实也是最能表达业务逻辑的面向过程编码)。

  1. function judge(fruit) {
  2. if (fruit === 'apple' || fruit === 'strawberry' || fruit === 'cherry' || fruit === 'cranberries') {
  3. console.log('red');
  4. }
  5. }

但是当 type 未来到 10 种甚至更多时, 我们只能继续添加 || 来维护代码么?

Array.includes

  1. // 将判断条件抽取成一个数组
  2. const redFruits = ['apple', 'strawberry', 'cherry', 'cranberries'];
  3. function judge(type) {
  4. if (redFruits.includes(fruit)) {
  5. console.log('red');
  6. }
  7. }

2.4 判断数组中是否所有项都满足某条件

🙌🌰

  1. const fruits = [
  2. { name: 'apple', color: 'red' },
  3. { name: 'banana', color: 'yellow' },
  4. { name: 'grape', color: 'purple' }
  5. ];
  6. function match() {
  7. let isAllRed = true;
  8. // 判断条件:所有的水果都必须是红色
  9. for (let f of fruits) {
  10. if (!isAllRed) break;
  11. isAllRed = (f.color === 'red');
  12. }
  13. console.log(isAllRed); // false
  14. }

上面的实现中,主要是为了处理数组中的所有项都符合条件。

Array.every

使用 Array.every 可以很容的实现这个逻辑:

🙌🌰

  1. onst fruits = [
  2. { name: 'apple', color: 'red' },
  3. { name: 'banana', color: 'yellow' },
  4. { name: 'grape', color: 'purple' }
  5. ];
  6. function match() {
  7. // 条件:所有水果都必须是红色
  8. const isAllRed = fruits.every(f => f.color == 'red');
  9. console.log(isAllRed); // false
  10. }

2.5 判断数组中是否存在某项满足条件

Array.some

相同的方式,如果我们想测试是否存在红色的水果,我们可以使用 Array.some 一行代码实现。

🙌 🌰

  1. const fruits = [
  2. { name: 'apple', color: 'red' },
  3. { name: 'banana', color: 'yellow' },
  4. { name: 'grape', color: 'purple' }
  5. ];
  6. function test() {
  7. // 条件:任何一个水果是红色
  8. const isAnyRed = fruits.some(f => f.color == 'red');
  9. console.log(isAnyRed); // true
  10. }

2.6 && 运算符 仅在为 true 的情况下

如果仅在变量值为 true 的情况下才调用函数,则可以使用 && 运算符。

🙌🌰

  1. // 长
  2. if (test1) {
  3. callMethod();
  4. }
  5. // 短
  6. test1 && callMethod();