JavaScript - 条件运算符

JavaScript - conditional operator

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

//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的行为。 n 在这里计算为 truthy。如果您也将 n 放在 if 语句中,情况会类似。

来自 Truthy 上的 MDN link:

In JavaScript, a truthy value is a value that is considered true when encountered in a Boolean context. All values are truthy unless they are defined as falsy (i.e., except for false, 0, -0, 0n, "", null, undefined, and NaN).

正如您所建议的,通过在 ternary operator, they are automatically converted to their boolean equivalent.

中引入任何类型的变量

这两个函数并不严格等价,因为第一个函数明确检查变量是否等于 0,而第二个函数不等于,因此 n 的计算结果为 false return 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

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

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

一些真实值是:

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

一些 falsey 值为:

  • ""
  • 这样的字符串
  • 人数0
  • 布尔值false
  • Nullundefined 值。

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


My guess is that n means n !== 0, but it looks so strange.

你是对的,在评估像n ?这样的值时,没有像n === "1"n === "0"这样的比较参数,JS根据它的值(truthyfalsey).