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
不是布尔值,但为什么它可以评估为 True
或 False
?即使可以,通过一些隐含的类型转换,其中 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中,每种类型的数据都可以作为布尔值计算。有两个可能的布尔值:truthy
和 falsey
值。
一些真实值是:
- 字符串不同于
""
- 数字不同于
0
- 布尔值
true
一些 falsey 值为:
- 像
""
这样的字符串
- 人数
0
- 布尔值
false
Null
和 undefined
值。
要将值转换为布尔值,您可以使用 !!
运算符,称为双非运算符。它转换 true 或 false 中的值取决于它的值(truthy
或 falsey
)。
My guess is that n means n !== 0, but it looks so strange.
你是对的,在评估像n ?
这样的值时,没有像n === "1"
或n === "0"
这样的比较参数,JS根据它的值(truthy
或 falsey
).
我有点困惑为什么下面两个函数是等价的。
//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的行为。 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中,每种类型的数据都可以作为布尔值计算。有两个可能的布尔值:truthy
和 falsey
值。
一些真实值是:
- 字符串不同于
""
- 数字不同于
0
- 布尔值
true
一些 falsey 值为:
- 像
""
这样的字符串
- 人数
0
- 布尔值
false
Null
和undefined
值。
要将值转换为布尔值,您可以使用 !!
运算符,称为双非运算符。它转换 true 或 false 中的值取决于它的值(truthy
或 falsey
)。
My guess is that n means n !== 0, but it looks so strange.
你是对的,在评估像n ?
这样的值时,没有像n === "1"
或n === "0"
这样的比较参数,JS根据它的值(truthy
或 falsey
).