# 你试过不用if撸代码吗？

### 示例1: 统计数组中的奇数

`const arrayOfIntegers = [1, 4, 5, 9, 0, -1, 5];`

#### 使用if

```let counter = 0;
arrayOfIntegers.forEach((integer) => {
const remainder = Math.abs(integer % 2);
if (remainder === 1) {
counter++;
}
});

console.log(counter);```

#### 不用if

```let counter = 0;

arrayOfIntegers.forEach((integer) => {
const remainder = Math.abs(integer % 2);
counter += remainder;
});

console.log(counter);```

### 示例2： 判断工作日和周末

#### 使用if

```const weekendOrWeekday = (inputDate) => {
const day = inputDate.getDay();

if (day === 0 || day === 6) {
return 'weekend';
}

return 'weekday';

// Or, for ternary fans:
// return (day === 0 || day === 6) ? 'weekend' : 'weekday';
};

console.log(weekendOrWeekday(new Date()));```

#### 不用if

```const weekendOrWeekday = (inputDate) => {
const day = inputDate.getDay();

return weekendOrWeekday.labels[day] ||
weekendOrWeekday.labels['default'];
};

weekendOrWeekday.labels = {
0: 'weekend',
6: 'weekend',
default: 'weekday'
};

console.log(weekendOrWeekday(new Date()));```

### 示例3: doubler函数

• 如果参数是数字，则乘以2(i.e. `5 => 10`, `-10 => -20`)；
• 如果参数是字符串，则每个字符重复2次 (i.e. `'hello' => 'hheelloo'`)；
• 如果参数是函数，则调用2次；
• 如果参数是数组，则将每一个元素作为参数，调用doubler函数
• 如果参数是对象，则将每个属性值作为参数，调用doubler函数

#### 使用switch

```const doubler = (input) => {
switch (typeof input) {
case 'number':
return input + input;
case 'string':
return input
.split('')
.map((letter) => letter + letter)
.join('');
case 'object':
Object.keys(input)
.map((key) => (input[key] = doubler(input[key])));
return input;
case 'function':
input();
input();
}
};

console.log(doubler(-10));
console.log(doubler('hey'));
console.log(doubler([5, 'hello']));
console.log(doubler({ a: 5, b: 'hello' }));
console.log(
doubler(function() {
console.log('call-me');
}),
);```

#### 不用switch

```const doubler = (input) => {
return doubler.operationsByType[typeof input](input);
};

doubler.operationsByType = {
number: (input) => input + input,
string: (input) =>
input
.split('')
.map((letter) => letter + letter)
.join(''),
function: (input) => {
input();
input();
},
object: (input) => {
Object.keys(input)
.map((key) => (input[key] = doubler(input[key])));
return input;
},
};

console.log(doubler(-10));
console.log(doubler('hey'));
console.log(doubler([5, 'hello']));
console.log(doubler({ a: 5, b: 'hello' }));
console.log(
doubler(function() {
console.log('call-me');
}),
);```

### 版权声明

https://blog.fundebug.com/2017/11/06/write-javascript-without-if/

0 条评论

• ### 你试过不用if撸代码吗？

译者按： 试着不用 if 撸代码，是件很有趣的事，而且，万一你领会了什么是“数据即代码，代码即数据”呢？

• ### 聊聊ES7与ES8特性

为了保证可读性，本文采用意译而非直译，并且对源代码进行了大量修改。另外，本文版权归原作者所有，翻译仅用于学习。

• ### 浅谈小程序运行机制

接触小程序有一段时间了，总得来说小程序开发门槛比较低，但其中基本的运行机制和原理还是要懂的。“比如我在面试的时候问到一个关于小程序的问题，问小程序有window...

• ### 你试过不用if撸代码吗？

译者按： 试着不用 if 撸代码，是件很有趣的事，而且，万一你领会了什么是“数据即代码，代码即数据”呢？

• ### 重构 - 完全不用 if-else 可能吗？

上次那篇重构-为什么 if-else 不是好代码 说到代码中的 if-else会随着代码量的增加，在迭代的过程中变的越来越难以维护， 然后用工厂模式的思路可以把...

• ### TensorFlow 基础实战

Tensorflow 是干嘛的，就不过多赘述了，小伙伴们可以访问官网来详细了解 https://www.tensorflow.org/

• ### 微信小程序里长按识别二维码

可以看到，我们成功的在小程序里实现了长按识别二维码的功能。下面就教大家如何一步步实现吧。因为官方的规格还没有明确说支持这个功能，所以这个功能有可能随时被禁。这...

• ### linux自启脚本(以及无法进入tty控制台)

2.放在/etc/init.d/目录下  （操作系统复制命令，在当前文件夹下复制sudo cp  auto /etc/init.d）[可能先要对init.d取得...

• ### 如何使用Prometheus监视您的Ubuntu 14.04服务器

Prometheus是由SoundCloud开发的开源监控系统。与其他监控系统（如InfluxDB和Graphite）一样，Prometheus将其所有数据存储...

Fundebug技术总监