JavaScript OR(||)短路奇怪的行为

时间:2014-04-10 16:12:39

标签: javascript variables short-circuiting

我正在编写一个小函数,它接受一个参数并尝试调用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(我的理解是short-circuit evaluation的JavaScript仅与undefinednullfalse值短路。

我希望有人能就此问题向我提供一点清晰的说明。

3 个答案:

答案 0 :(得分:5)

0是假的,因此将评估逻辑||中的另一个表达式。这就是你得到"0"的原因。您可以像这样确认

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

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

答案 1 :(得分:2)

我认为你真正想做的是:

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

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

答案 2 :(得分:0)

正如您所陈述的那样,0被视为虚假(它是假的)。因为它是假的,所以评估右边的表达式,"0"的大写版本显然是相同的。

你到底想用|| value.toUpperCase()做什么?