写好 JS 条件语句的 5 条守则

  • 代码比较短且直接,包含if嵌套的更清晰

  • 倒置判断条件可能加重思考的负担(增加认知载荷)

因此,应当尽力减少嵌套和尽早return,但不要过度。如果你感兴趣的话,可以看一下关于这个话题的一篇文章和 StackOverflow 上的讨论。

  • Avoid Else, Return Early by Tim Oxley

  • StackOverflow discussion on if/else coding style

3.使用默认参数和解构

我猜下面的代码你可能会熟悉,在JavaScript中我们总是需要检查 null / undefined的值和指定默认值:

function test(fruit, quantity) {

if (!fruit) return;

// 如果 quantity 参数没有传入,设置默认值为 1

const q = quantity || 1;

console.log(We have ${q} ${fruit}!);

}

//test results

test(‘banana’); // We have 1 banana!

test(‘apple’, 2); // We have 2 apple!

实际上,我们可以通过声明 默认函数参数 来消除变量 q。

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分配默认值:function test(fruit = ‘unknown’, quantity = 1)。

如果fruit是一个object会怎么样?我们能分配一个默认参数吗?

function test(fruit) {

// 当值存在时打印 fruit 的值

if (fruit && fruit.name)  {

console.log (fruit.name);

} else {

console.log(‘unknown’);

}

}

//test results

test(undefined); // unknown

test({ }); // unknown

test({ name: ‘apple’, color: ‘red’ }); // apple

看上面这个例子,我们想打印 fruit 对象中可能存在的 name 属性。否则我们将打印unknown。我们可以通过默认参数以及解构从而避免判断条件 fruit && fruit.name

// 解构 - 仅仅获取 name 属性

// 为其赋默认值为空对象

function test({name} = {}) {

console.log (name || ‘unknown’);

}

// test results

test(undefined); // unknown

test({ }); // unknown

test({ name: ‘apple’, color: ‘red’ }); // apple

由于我们只需要 name 属性,我们可以用 {name} 解构出参数,然后我们就能使用变量 name 代替 fruit.name。

我们也需要声明空对象 {} 作为默认值。如果我们不这么做,当执行 test(undefined) 时,你将得到一个无法对 undefined 或 null 解构的的错误。因为在 undefined 中没有 name 属性。

如果你不介意使用第三方库,这有一些方式减少null的检查:

  • 使用 Lodash get函数

  • 使用Facebook开源的idx库(with Babeljs)

这是一个使用Lodash的例子:

function test(fruit) {

// 获取属性名,如果属性名不可用,赋默认值为 unknown

console.log(__.get(fruit, ‘name’, ‘unknown’);

}

// test results

test(undefined); // unknown

test({ }); // unknown

test({ name: ‘apple’, color: ‘red’ }); // apple

你可以在jsbin运行demo代码。除此之外,如果你是函数式编程的粉丝,你可能选择使用 Lodash fp,Lodash的函数式版本(方法变更为get或者getOr)。

4.倾向于对象遍历而不是Switch语句

让我们看下面这个例子,我们想根据 color 打印出水果:

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) || [];

}

Map是一种在 ES2015 规范之后实现的对象类型,允许你存储 key 和 value 的值。

但我们是否应当禁止switch语句的使用呢?答案是不要限制你自己。从个人来说,我会尽可能的使用对象遍历,但我并不严格遵守它,而是使用对当前的场景更有意义的方式。

Todd Motto有一篇关于 switch 语句对比对象遍历的更深入的文章,你可以在这个地方阅读

TL;DR; 重构语法

在上面的例子,我们能够用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 test(color) {

return fruits.filter(f => f.color == color);

}

有着不止一种方法能够实现相同的结果,我们以上展示了 4 种。

5.对 所有/部分 判断使用Array.every & Array.some

这最后一个建议更多是关于利用 JavaScript Array 的内置方法来减少代码行数。看下面的代码,我们想要检查是否所有水果都是红色:

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’);

}

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 test() {

// 条件:任何一个水果是红色

const isAnyRed = fruits.some(f => f.color == ‘red’);

console.log(isAnyRed); // true

}

6.总结

让我们一起生产更多可读性高的代码。我希望你能从这篇文章学到东西。

这就是所有的内容。编码快乐!

相关文章

  1. 20个常用的JavaScript简写技巧

  2. Javascript 里的奇葩知识

  3. 23条JavaScript初学者应知的最佳实践方法

最后

转发文章并关注公众号:前端开发博客,回复 1024,领取前端进阶资料

  1. 回复「Vue」获取 Vue 精选文章

  2. 回复「面试」获取 面试 精选文章

  3. 回复「JS」获取 JavaScript 精选文章

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
厂,18年进入阿里一直到现在。**

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-AQIhlPva-1715087925797)]

[外链图片转存中…(img-8xZebR51-1715087925798)]

[外链图片转存中…(img-xMpzZ23B-1715087925798)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值