如今最先,请尝试只管防止运用if
语句来完成我们的营业
你能够会疑问不运用if
有什么优点?额~,能够也没啥很显著的优点,就是换种思索体式格局来解决问题。if-else
并没有错,但在某些状况下大批的if-else
能够会下降代码可读性。下面会枚举一些实例带你感觉个中的玄妙。
Challenge #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);
// 偶数除2的余数为零,奇数的余数为一
counter += remainder;
});
console.log(counter);
记: 上述两个例子,forEach是会转变原数组的,要领是可变的
,违犯了当下所首倡的函数式编程immutable
理念,不必在乎,不是本文关注点。两个例子比较而言,if语句
的完成能够更具兼容性,能够适应于数组元素是小数
的状况。若数组元素为浮点范例,第二个例子就没法一般运用。
Challenge #2: 推断一个日期是周末照样工作日
完成一个函数,日期对象 new Date()
作为输入,依据差别日期返回当天是工作日
照样周末
。
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()));
有无注意到,if语句
中的数字代表哪天是周末,剖断前提散布的较为零星,我们须要做的是将数字和周末或工作日
范例对应起来,如例子2,能够运用一个对象或许map来存储对应关联。
上述两个例子对照,能够显著看出非if代码
完成具有更好的可读性和扩展性
Challenge #3: The doubler function (here be dragons),翻译不出来~尬~
完成一个doubler函数,依据输入差别,做以下处置惩罚:
- 若输入是
number
范例, 做翻倍处置惩罚(5 => 10, -10 => -20) - 若输入是
string
范例,反复每一个字符(‘hello’ => ‘hheelloo’) - 若输入是
function
范例,挪用实行两次函数 - 若输入是
array
范例,对数组的每一个元素做doubler
处置惩罚 - 若输入是
object
范例,对对象的每一个属性做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');
}),
);
和Challenge #2相似,将前提值聚合在一起做一致处置惩罚。
总结
当if-else
的推断前提较多时,将前提做集合处置惩罚(用object存储其对应关联–前提做key,处置惩罚做value)。优点是增删某个前提变得轻易,代码越发可读,首倡运用key-value
对应来庖代一部分的if-else
的前提推断。
【开辟环境引荐】
Cloud Studio 是基于浏览器的集成式开辟环境,支撑绝大部分编程言语,包含 HTML5、PHP、Python、Java、Ruby、C/C++、.NET 小顺序等等,无需下载安装顺序,一键切换开辟环境。 Cloud Studio供应了完全的 Linux 环境,而且支撑自定义域名指向,动态盘算资本调解,能够完成种种运用的开辟编译与布置。