【问题标题】: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 不是布尔值,但为什么它可以评估为True 或False?即使可以,通过一些隐含的类型转换,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 中,每种类型的数据都可以计算为布尔值。有两个可能的布尔值:truthy 和 falsey 值。
一些真实价值观是:
- 字符串不同于
""
- 与
0 不同的数字
- 布尔值
true
一些错误的值是:
-
"" 等字符串
- 号码
0
- 布尔值
false
-
Null 和 undefined 值。
要将值转换为布尔值,您可以使用!! 运算符,称为双非运算符。它将值转换为 true 或 false 取决于其值(truthy 或 falsey)。
我的猜测是 n 表示 n !== 0,但它看起来很奇怪。
你是对的,当评估像 n ? 这样的值时,没有像 n === "1" 或 n === "0" 这样的比较参数 JS 根据其值(truthy 或 falsey)将值转换为布尔值。