条件变量赋值的最佳方法

Best Way for Conditional Variable Assignment

本文关键字:最佳 方法 赋值 变量 条件      更新时间:2023-09-26

哪种条件变量赋值方法更好?

第一种方法

 if (true) {
   var myVariable = 'True';
 } else {
   var myVariable = 'False';
 }

第二种方法

 var myVariable = 'False';
 if (true) {
   myVariable = 'True';
 }

我实际上更喜欢第二个,没有任何特定的技术原因。你们怎么看?

试试这个

var myVariable = (true condition) ? "true" : "false"

我知道有两种方法可以通过条件声明变量的值。

方法 1:如果条件的计算结果为 true,则列左侧的值将分配给变量。如果条件的计算结果为 false,则右侧的条件将分配给变量。您还可以将多个条件嵌套到一个语句中。

var a = (true)? "true" : "false";

方法 1 的嵌套示例:将变量 A 值更改为 0、1、2 和负值,以查看语句将如何生成结果。

var a = 1;
var b = a > 0? (a === 1? "A is 1" : "A is not 1") : (a === 0? "A is zero" : "A is negative");

方法2:在此方法中,如果||左侧的值等于零,false,null,未定义或空字符串,则右侧的值将被分配给变量。如果 || 左侧的值不等于零、假、未定义空或空字符串,则左侧的值将分配给变量。

虽然左边的值可以是 JS 评估条件的未定义值,但必须声明变量,否则将产生异常。

var a = 0;
var b = a || "Another value";

执行此操作的另一种方法是利用逻辑运算符返回值的能力。

let isAnimal = false;
let isPlant = true;
let thing = isAnimal && 'animal' || isPlant && 'plant' || 'something else';
console.log(thing);

在上面的代码中,当其中一个标志为 true isAnimalisPlant 时,返回它旁边的字符串。这是因为&&||都会导致其操作数之一的值:

  • 如果 A 可以被强制为 false,则 A && B 返回值 A;否则,它返回 B。
  • 一 ||如果 A 可以强制为 true,则 B 返回值 A;否则,它返回 B。

受本文启发的答案:https://mariusschulz.com/blog/the-and-and-or-operators-in-javascript

PS:只能用于学习目的。不要通过在生产代码中使用此方法使您和您的同事的生活更加困难。

你可以做一个三元,它要短得多(而且没有的大括号):

var myVariable = (true) ? 'True' : 'False';

另一个很酷的事情是,您可以根据条件进行多个分配:

let [long_str, short_str] = a.length > b.length ? [a, b] : [b, a]
第三

种方式,当你在变量中只存储真假时,使用

 var myVariable =(condition_written_in_if);

为了完成,除了这里提到的所有其他方法之外,还有另一种方法,即使用查找表。

假设您有许多可能的值,则可以声明性地配置 Map,而不是使用 ifswitchternary 语句。

Object map = {
   key1: 'value1',
   key2: 'value2',
   keyX: 'valueX'
};
var myVariable = map[myInput];

这甚至适用于布尔值:

Object map = { true: 'value1', false: 'value2 };
var myVariable = map[myBoolean];

对于布尔值,您可能会使用专门为此设计的逻辑运算符以"正常"的方式执行此操作。尽管有时它可能很有用,例如:

  • 便携性:您可以传递地图
  • 可配置性:可能值来自属性文件
  • 可读性:如果你不在乎它是否是布尔值,你只想避免条件逻辑,并以这种方式减少认知负荷

请注意,使用查找映射的优点与使用函数变量(闭包)的优点之间存在一些重叠。

第一个解决方案仅使用一个赋值,而不是第二个代码片段中的平均 1,5。另一方面,第一个代码片段的可读性较差,因为不熟悉 JavaScript 的人可能没有意识到变量的作用域不是面向函数的块导向的 - 在其他具有类似 C 语法的语言上myVariableifelse块之外无法访问。

换句话说,这两种解决方案都有缺点。三元运算符呢:

var myVariable = condition? 'True' : 'False';

或者如果你不关心骆驼案(尽管我知道这只是一个例子,而不是真正的代码);

var myVariable = (!!condition).toString();

如果你厌倦了三元运算符,那就用IIFE

另一种方法是使用立即调用的函数表达式。它的好处是它可以容纳一些逻辑,并且可以从外部世界封装。

const direction = "n";
const directionFull= (() => {
    switch(direction ){
        case "n": return "north";
        case "s": return "south";
        case "w": return "west";
        case "e": return "east"; 
    }
})()
console.log(directionFull);

我也更喜欢第二个选项,没有技术原因,但为了易于阅读代码,可读性在代码中非常重要。

如果您看到第二个选项,从处理的角度来看,只会执行一次检查,从而节省了非常小的处理时间,因此在第二种情况下只有一个检查。

这取决于

我的用途。如果我有代码,我只想在 true 时运行,但没有额外的 false 代码,我将使用第二个。如果我想在 true 上执行一些代码,而在 false 上执行不同的代码,我使用第一个。这完全取决于用途,但对我来说,一般规则是写一次。保持干净,保持简单,并保持简短

也许你只需要&&运算符来检查布尔值是否为真,如果是,则将"myVariable"断言为真。

var myVariable = 'False';
true && myVariable = 'True';
<</div> div class="answers">

如果您需要做的就是将布尔值转换为字符串,则应明确执行此操作:

var myBool = true;
var myVariable = myBool.toString(); // 'true'
// '' + myBool, ''.concat(myBool), etc. also work

如果第一个字母大写很重要,就像在你的例子中一样,这并不难做到;例如,请参阅这个答案。

地图和对象的另一种方法:(地图对键类型更灵活,对象更易读恕我直言)

const condition_var = 'e'
const options1 = new Map([ ['n','north'],['s','south'],['e','east'],['w','west']])
const myVar1 = options1.get(condition_var) || null
const options2 = {n:'north', s:'south', e:'east', w:'west'}    
const myVar2 = options2[condition_var] || null
console.log(myVar1)
console.log(myVar2)

如果您尝试做的是设置一个值(如果它不是 null/undefined),否则使用另一个值,则可以使用 nullish 合并运算符:

const thing = obj.field ?? otherVal;