【问题标题】:JavaScript - conditional operatorJavaScript - 条件运算符
【发布时间】:2021-10-22 02:05:04
【问题描述】:

我有点困惑为什么以下两个函数是等价的。

//Function 1

function sumTo(n) {
   if (n === 0) return 0;  // base case
   return n + sumTo(n-1);  // inductive step
}

//Function 2
function sumTo(n) {
   return n ? n + sumTo(n-1) : 0;
}

在函数 2 中,它使用条件运算符,其中条件为 n。条件n 在这里是什么意思?我的主要困惑是n 不是布尔值,但为什么它可以评估为TrueFalse?即使可以,通过一些隐含的类型转换,0 可以被解释为False,不应该是return n ? 0 : n + sumTo(n-1) 让整个事情有意义吗?
我的猜测是n 的意思是n !== 0,但它看起来很奇怪。

【问题讨论】:

标签: javascript conditional-operator


【解决方案1】:

这是 JavaScript 的行为。 n 在此处被评估为 truthy。如果您也将 n 放在 if 语句中,情况也会类似。

来自 Truthy 上的 MDN 链接:

在 JavaScript 中,真值是在布尔上下文中遇到时被认为是真的值。所有值都是真实的,除非它们被定义为虚假(即,除了 false、0、-0、0n、""、null、undefined 和 NaN)。

【讨论】:

    【解决方案2】:

    正如您所建议的,通过在 ternary operator 中引入任何类型的变量,它们会自动成为 converted to their boolean equivalent

    这两个函数不是严格等价的,因为第一个函数显式检查变量是否等于0,而第二个函数不等于,所以n 将评估为false,如果包含则返回0任何falsy 值,例如false''undefined 或其他任何值。

    function sumTo(n) {
       if (n === 0) return 0;  // base case
       return n + sumTo(n-1);  // inductive step
    }
    
    sumTo(false); // Uncaught RangeError: Maximum call stack size exceeded

    function sumTo(n) {
       return n ? n + sumTo(n-1) : 0;
    }
    
    console.log(sumTo(false)); // 0

    【讨论】:

      【解决方案3】:

      你是对的,在这种情况下n表示n !== 0,同样适用于空字符串例如var str = "",如果你运行if(str)在这种情况下会返回false,因为字符串是空的

      【讨论】:

        【解决方案4】:

        在 Javascript 中,每种类型的数据都可以计算为布尔值。有两个可能的布尔值:truthyfalsey 值。

        一些真实价值观是:

        • 字符串不同于""
        • 0 不同的数字
        • 布尔值true

        一些错误的值是:

        • "" 等字符串
        • 号码0
        • 布尔值false
        • Nullundefined 值。

        要将值转换为布尔值,您可以使用!! 运算符,称为双非运算符。它将值转换为 truefalse 取决于其值(truthyfalsey)。


        我的猜测是 n 表示 n !== 0,但它看起来很奇怪。

        你是对的,当评估像 n ? 这样的值时,没有像 n === "1"n === "0" 这样的比较参数 JS 根据其值(truthyfalsey)将值转换为布尔值。

        【讨论】:

          猜你喜欢
          • 2010-10-26
          • 1970-01-01
          • 2019-07-21
          • 2017-12-03
          • 2013-03-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多