在 JavaScript 中编写更好的条件的技巧
如果您正在使用 JavaScript,您将编写大量涉及大量条件的代码。起初,条件句似乎很容易学习,但除了编写一些 if-else 语句之外,还有更多的东西。
面向对象的编程允许人们避免条件并用多态性和继承代替它们。你应该尽可能地遵循这些原则。但另一方面,由于各种原因,您最终可能会在代码中使用条件。本文的目的是帮助您组织条件语句。
使用条件编写代码的提示:
- Array.includes:您可以对多个条件使用array.includes()方法。 array.includes()方法用于确定数组中是否存在特定元素。它返回“真”或“假”
示例:以下代码演示了如何检查动物是“狮子”还是“狗”。
Javascript
// function function test(animal) { if (animal == 'Lion' || animal == 'dog') { console.log('Valid'); } } // function call test('dog');
Javascript
function test(animal) { const animals = ['dog', 'cat', 'cow', 'Lion']; // Used to check if a particular // element is present if (animals.includes(animal)) { console.log('valid'); } } console.log(test('dog'));
Javascript
// Array of objects const cars = [ { name: 'car1', color: 'red' }, { name: 'car2', color: 'blue' }, { name: 'car3', color: 'purple' } ]; function test() { let isAllblue = true; // Condition: all cars must be blue for (let c of cars) { if (!isAllblue) break; isAllblue = (c.color == 'blue'); } console.log(isAllblue); } test();
Javascript
// Array of objects const cars = [ { name: 'car1', color: 'red' }, { name: 'car2', color: 'blue' }, { name: 'car3', color: 'purple' } ]; function test() { // Condition: short way // all cars must be in blue color const isAllblue = cars.every( c => c.color == 'blue'); console.log(isAllblue); } test();
Javascript
// Array of objects const cars = [ { name: 'car1', color: 'red' }, { name: 'car2', color: 'blue' }, { name: 'car3', color: 'purple' } ]; function test1() { // Condition: if any car is in blue color const isAnyblue = cars.some(c => c.color == 'blue'); console.log(isAnyblue); } test1();
Javascript
function IsRed(someObject) { // Declare a variable to // store the final value var willRed; // Compare type of object if (typeof someObject === 'object') { // Check object color property // is red or not if (someObject.color === 'Red') { willRed = true; } else { willRed = false; } } else { willRed = false; } return willRed; }
Javascript
// Use return instead of else statement function IsRed(someObject) { if (typeof someObject !== 'object') { return false; } if (someObject.color !== 'Red') { return false; } return true; }
Javascript
// Here you can reduce your code function IsRed(someObject) { // 2 if statements replaced // by 1 if statement if ( typeof someObject !== 'object' || someObject.color !== 'Red' ) { return false; } return true; }
Javascript
function IsRed(someObject) { return typeof someObject !== 'object' || someObject.color !== 'Red' ? false : true; }
Javascript
function printCars(color) { // Use switch case to // find cars by color switch (color) { case 'red': return ['Rcar1', 'Rcar2']; case 'blue': return ['Bcar1', 'Bcar2']; case 'purple': return ['Pcar1', 'Pcar2']; default: return []; } } printCars(null); printCars('blue');
Javascript
// Use object literal to // find cars by color const carColor = { red: ['Rcar1', 'Rcar2'], blue: ['Bcar1', 'Bcar2'], purple: ['Pcar1', 'Pcar2'] }; function printcars(color) { return carColor[color] || []; } console.log(printcars()); console.log(printcars('red')); console.log(printcars('blue'));
Javascript
// Use map to find cars by color const carColor = new Map() .set('red', ['Rcar1', 'Rcar2']) .set('blue', ['Bcar1', 'Bcar2']) .set('purple', ['Pcar1', 'Pcar2']); function printcars(color) { return carColor.get(color) || []; } console.log(printcars()); console.log(printcars('red')); console.log(printcars('blue'));
Javascript
function check(flower, quantity) { if (!flower) return; // If quantity not provided, // set default to one const a = quantity || 1; console.log("I have ${a} ${flower}!"); } // Results check('Rose'); check('Lotus', 2);
Javascript
// If quantity not provided, parameter // provided to set default to one function check(flower, quantity = 1) { if (!flower) return; console.log(`I have ${quantity} ${flower}!`); } // Results // (Default parameter is set) check('Rose'); check('Lotus', 2);
Javascript
function check(flower) { // Print flower name if // value provided if (flower && flower.name) { console.log(flower.name); } else { console.log('unknown'); } } // Results check(undefined); check({}); check({ name: 'Rose', color: 'red' });
Javascript
// Destructing access name property only // assign the default empty object {} function check({name} = {}) { console.log (name || 'unknown'); } // Results check(undefined); check({ }); check({ name: 'Rose', color: 'red' });
输出:
Valid
上面的代码似乎很简单,因为您只有两种动物要检查。但是,您不确定用户的输入。如果你再养几只动物怎么办?如果你继续用更多的OR语句扩展语句,代码会更难维护并且看起来很不干净。
您可以重写该函数以使其更清晰。如果您想检查其他动物,您需要做的就是添加一个新的数组项。
Javascript
function test(animal) { const animals = ['dog', 'cat', 'cow', 'Lion']; // Used to check if a particular // element is present if (animals.includes(animal)) { console.log('valid'); } } console.log(test('dog'));
输出:
valid
您可以创建一个动物数组,以将条件与代码的其余部分分开。您甚至可以在函数范围之外声明变量,并在需要的地方重用它。这是一种编写易于理解和维护的更简洁代码的方法。
- Array.every & Array.some:
array.every()方法用于检查数组中存在的所有元素是否满足给定条件。当每个数组元素满足给定条件时返回“true”,否则返回“false”。
array.some()方法检查数组中的任何元素是否通过了所提供函数的测试。 array.some()方法对数组的每个元素执行一次函数。它检查数组的至少一个元素是否满足条件。
这两个 JavaScript 数组函数用于减少代码行数。看看下面给出的代码。
Javascript
// Array of objects const cars = [ { name: 'car1', color: 'red' }, { name: 'car2', color: 'blue' }, { name: 'car3', color: 'purple' } ]; function test() { let isAllblue = true; // Condition: all cars must be blue for (let c of cars) { if (!isAllblue) break; isAllblue = (c.color == 'blue'); } console.log(isAllblue); } test();
输出:
false
上面的代码有点长。您可以使用Array.every()方法来减少它。
Javascript
// Array of objects const cars = [ { name: 'car1', color: 'red' }, { name: 'car2', color: 'blue' }, { name: 'car3', color: 'purple' } ]; function test() { // Condition: short way // all cars must be in blue color const isAllblue = cars.every( c => c.color == 'blue'); console.log(isAllblue); } test();
输出:
false
您也可以使用Array.some()方法来实现它
Javascript
// Array of objects const cars = [ { name: 'car1', color: 'red' }, { name: 'car2', color: 'blue' }, { name: 'car3', color: 'purple' } ]; function test1() { // Condition: if any car is in blue color const isAnyblue = cars.some(c => c.color == 'blue'); console.log(isAnyblue); } test1();
输出:
true
- Return Early 或 Early exit: JavaScript 中的 Return Early 是一种将函数体减少到零“else”语句数量的简单方法。在代码中使用 Return Early 的原因有很多。
- 它减少了代码的总量。
- 它通过降低逻辑复杂性来减少行的长度。
- 它有助于提高可读性。
Return early 的目的是通过在主体的“if”语句中使用“return”关键字来消除 JavaScript 函数中对“else”条件的需求。让我们创建一个在特定条件下表现不同的函数。
注意:下面演示了上述解释的伪代码。
Javascript
function IsRed(someObject) { // Declare a variable to // store the final value var willRed; // Compare type of object if (typeof someObject === 'object') { // Check object color property // is red or not if (someObject.color === 'Red') { willRed = true; } else { willRed = false; } } else { willRed = false; } return willRed; }
这个函数很清楚,但它似乎是不必要的复杂。 Return early 模式可用于提高可读性并减少“else”语句的数量。
Javascript
// Use return instead of else statement function IsRed(someObject) { if (typeof someObject !== 'object') { return false; } if (someObject.color !== 'Red') { return false; } return true; }
使用 Return Early 模式,我们能够消除所有不必要的“else”语句,并使您的函数更加清晰和简洁。
你也可以只使用一个“if”语句来重构这个函数。
Javascript
// Here you can reduce your code function IsRed(someObject) { // 2 if statements replaced // by 1 if statement if ( typeof someObject !== 'object' || someObject.color !== 'Red' ) { return false; } return true; }
通过使用 JavaScript 的三元运算符,可以在一行代码中再次重构此函数。
Javascript
function IsRed(someObject) { return typeof someObject !== 'object' || someObject.color !== 'Red' ? false : true; }
通过减少条件,您减少了所有嵌套的“if”语句。
注意:始终以减少嵌套为目标并尽早返回,但不要破坏它。如果您的代码简短而直接,并且使用嵌套的“if”更清晰。
- 使用对象字面量或映射:对象字面量基本上是一个键值对数组,用于代替 switch 语句。让我们看看下面的例子。
Javascript
function printCars(color) { // Use switch case to // find cars by color switch (color) { case 'red': return ['Rcar1', 'Rcar2']; case 'blue': return ['Bcar1', 'Bcar2']; case 'purple': return ['Pcar1', 'Pcar2']; default: return []; } } printCars(null); printCars('blue');
输出:
[] ['Bcar1', 'Bcar2']
上面的代码可以通过使用对象字面量量和完全替换“switch”语句来重构。
Javascript
// Use object literal to // find cars by color const carColor = { red: ['Rcar1', 'Rcar2'], blue: ['Bcar1', 'Bcar2'], purple: ['Pcar1', 'Pcar2'] }; function printcars(color) { return carColor[color] || []; } console.log(printcars()); console.log(printcars('red')); console.log(printcars('blue'));
输出:
[] ['Rcar1', 'Rcar2'] ['Bcar1', 'Bcar2']
您也可以使用 Map 来实现相同的结果。
Javascript
// Use map to find cars by color const carColor = new Map() .set('red', ['Rcar1', 'Rcar2']) .set('blue', ['Bcar1', 'Bcar2']) .set('purple', ['Pcar1', 'Pcar2']); function printcars(color) { return carColor.get(color) || []; } console.log(printcars()); console.log(printcars('red')); console.log(printcars('blue'));
输出:
[] ['Rcar1', 'Rcar2'] ['Bcar1', 'Bcar2']
- 使用默认函数参数和解构:默认参数是一种为未传入值的函数参数设置默认值的方法,即“未定义”。
Javascript
function check(flower, quantity) { if (!flower) return; // If quantity not provided, // set default to one const a = quantity || 1; console.log("I have ${a} ${flower}!"); } // Results check('Rose'); check('Lotus', 2);
输出:
I have 1 Rose! I have 2 Lotus!
现在您可以使用函数参数来设置默认值
Javascript
// If quantity not provided, parameter // provided to set default to one function check(flower, quantity = 1) { if (!flower) return; console.log(`I have ${quantity} ${flower}!`); } // Results // (Default parameter is set) check('Rose'); check('Lotus', 2);
输出:
I have 1 Rose! I have 2 Lotus!
如果花变量是一个对象怎么办?您可以为其分配默认参数吗?
Javascript
function check(flower) { // Print flower name if // value provided if (flower && flower.name) { console.log(flower.name); } else { console.log('unknown'); } } // Results check(undefined); check({}); check({ name: 'Rose', color: 'red' });
输出:
unknown unknown Rose
在上面的示例中,如果“花”名称可用,我们要打印它,否则如果值未知,它将打印“未知”。我们可以通过使用默认函数参数析构来避免条件“flower”和“flower.name”。
解构允许您从对象中提取属性。
Javascript
// Destructing access name property only // assign the default empty object {} function check({name} = {}) { console.log (name || 'unknown'); } // Results check(undefined); check({ }); check({ name: 'Rose', color: 'red' });
输出:
unknown unknown Rose
我们需要来自花的属性名称,您可以使用{name}解构该参数,然后在代码中使用name作为变量而不是flower.name因为解构允许您将对象的属性分配给变量。
您还需要将空对象 {} 分配为默认值。如果你不这样做,它会在执行“check(undefined)”行时显示错误,即不能解构'undefined'或'null'的属性名称,因为undefined或null中没有name属性。