JavaScript或(| |)短路异常行为

JavaScript或(| |)短路异常行为,javascript,variables,short-circuiting,Javascript,Variables,Short Circuiting,我正在编写一个小函数,它接受一个参数,并尝试调用parseInt(value)| value.toUpperCase(),但它在某些值上无法按预期工作 function convert(value) { return parseInt(value) || value.toUpperCase(); } 一些示例输出是 转换(“asdf”)->“asdf” 转换(“汽车”)->“汽车” 转换(“1”)->1 转换(“52”)->52 但由于某种原因,当我输入“0”时,我将返回“0”。我尝试

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

function convert(value)
{
    return parseInt(value) || value.toUpperCase();
}
一些示例输出是
转换(“asdf”)->“asdf”

转换(“汽车”)->“汽车”

转换(“1”)->1

转换(“52”)->52

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


我能想到的唯一借口是
0 | |“0”
总是解析为
“0”
,因为它将
0
视为未定义或空值(我的理解是,JavaScript的功能只与
未定义
值短路)。


我希望有人能给我一点关于这个问题的澄清。

0
是错误的,因此将对逻辑
|
中的另一个表达式进行计算。这就是为什么您会得到
“0”
。你可以这样确认

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

由于
1
是真实的,它会短路并且不执行
console.log(“第一”)
,但是
0
是错误的,所以它会继续执行
console.log(“第二”)

,我想您真正想要做的是:

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

说明:这将检查
是否可以转换为
数字
,然后返回相应的转换。

正如您自己所述,
0
被视为false(错误)。因为它是false,所以对右侧的表达式求值,而
“0”
的大写版本显然是相同的


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

0
是错误的。falsy值的列表为
0
未定义
null
NaN
。(这不包括
false
;这是一个哲学问题,它是否“虚假:)看起来你自己已经回答了这个问题。虽然
0
不被视为
undefined
,而是像
undefined
和任何其他错误的值一样。防止
|
短路的值是
0
null
undefined
NaN
”。任何其他值都会触发短路并阻止对第二个操作数的求值。更多关于Falsy值的读取。感谢@Adoba提供了一个很好的链接。分享的文章很有见地。isNaN(parseInt(value))可以是isNaN(value),感谢修改后的函数,这正是我所需要的。@Luke很好的发现!虽然像“15a”这样的角位大小写有区别,这取决于Aaronias希望将它们解析为数字还是大写字符串,但他需要的是
parseInt()
。我假设“15a”应该是一个字符串,所以我会调整我的答案。如果你传递的是非字符串,请记住
isNaN(null)
false
isNaN({})
true
。这两种情况都会导致错误。如果您期望任何值
isNaN(值)?字符串(值).toUpperCase():数字(值)将更好地工作。正如S.B.所指出的,Number使用与isNaN相同的规则,这与parseInt不同。感谢您简洁准确的回答,这正是我想要的。