【问题标题】:JavaScript OR (||) Short Circuit Strange BehaviorJavaScript OR (||) 短路奇怪行为
【发布时间】:2014-04-10 16:12:38
【问题描述】:

我正在编写一个小函数,它接受一个参数并尝试调用parseInt(value) || value.toUpperCase(),但它无法按预期使用某些值。

function convert(value)
{
    return parseInt(value) || value.toUpperCase();
}

一些示例输出是
convert("asdf") -> "ASDF"
convert("Car") -> "CAR"
convert("1") -> 1
convert("52") -> 52

但由于某种原因,当我输入“0”时,我得到了“0”。我尝试调用parseInt("0"),它正确解析出0,但是当与|| "0".toUpperCase()结合使用时,它总是返回字符串"0"

我能想出的唯一借口是0 || "0" 总是解析为"0",因为它将0 视为未定义或null(我的理解是JavaScript 的short-circuit evaluation 只是与@987654336 短路@、nullfalse 值)。

我希望有人可以就这个问题为我提供一点澄清。

【问题讨论】:

  • 0 的值是假的。虚假值列表是 0""undefinednullNaN。 (这不包括false;它是否“虚假”是一个哲学问题:)
  • 看来您已经自己回答了这个问题。尽管 0 不被视为 undefined,而是 like undefined 和任何其他虚假值。
  • 防止||短路的值是0nullundefinedNaN""false。任何其他值都会触发短路并阻止对第二个操作数的评估。
  • 更多关于 Falsy 值的阅读。 sitepoint.com/javascript-truthy-falsy
  • 感谢@Adoba 提供了一个很棒的链接。分享的文章很有见地。

标签: javascript variables short-circuiting


【解决方案1】:

0 是假的,所以逻辑 || 中的另一个表达式将被计算。这就是您收到"0" 的原因。你可以这样确认

1 || console.log("First");
0 || console.log("Second");
# Second

由于1 是真的,它会短路并且不会执行console.log("First"),但0 是假的,所以它会继续执行console.log("Second")

【讨论】:

  • 感谢您提供简洁准确的答案,正是我想要的。
【解决方案2】:

我认为你真正想做的是:

return isNaN(value) ? value.toUpperCase() : parseInt(value);

说明:这会检查value 是否可以转换为Number,然后返回适当的转换。

【讨论】:

  • isNaN(parseInt(value)) 可以是 isNaN(value)
  • 感谢修改后的功能,这正是我所需要的。
  • @Luke 很好的发现!尽管像“15a”这样的极端情况有所不同,并且取决于 Aaronias 是否希望将这些解析为数字或大写字符串,但他是否需要 parseInt()。我假设“15a”应该是一个字符串,所以我会调整我的答案。
  • 如果您传递的是非字符串,请记住 isNaN(null)falseisNaN({})true。这两种情况都会导致错误。如果您期望任何值 isNaN(value) ? String(value).toUpperCase() : Number(value); 会更好。 Number 使用与 isNaN 相同的规则,与 parseInt 不同,如 S.B.指出。
【解决方案3】:

正如您自己所说,0 被视为假(这是假的)。既然是假的,就对右边的表达式求值,"0"的大写版本显然是一样的。

你究竟想在那里使用|| value.toUpperCase() 做什么?

【讨论】:

    猜你喜欢
    • 2016-07-17
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    • 2011-07-28
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多