为啥在三元运算符中使用“0”会返回第一个值?
Posted
技术标签:
【中文标题】为啥在三元运算符中使用“0”会返回第一个值?【英文标题】:Why does using "0" with the ternary operator return the first value?为什么在三元运算符中使用“0”会返回第一个值? 【发布时间】:2015-08-20 15:58:44 【问题描述】:我在玩 JSconsole 时发现了一些奇怪的东西。 "0"
的值为 false
"0" == false
=> true
false
的值在三进制中使用时返回第二个值
false ? 71 : 16
=> 16
但是,在三进制中使用等于 false
的值 "0"
返回第一个值。
"0" ? 8 : 10
=> 8
但是,如果你使用0
作为值,它会返回第二个值
0 ? 4 : 5
=> 5
0 == "0"
=> true
恐怕这对我来说没有意义。
【问题讨论】:
"0"
是一个非空字符串,即不是假值
那为什么使用比较时“0”等于false==
==
在 javascript 中没有意义。 '' == 0
,0 == '0'
,但'' != '0'
。不要假设因为x == y
、x
和y
的行为远程相同。
这是 Javascript 中比较容易混淆的特性之一。至少有四种 (!) 值可以== false
但不是“假”的情况。我在All falsey values in JavaScript 问题下整理了一份参考指南。我想我已经记录了所有与虚假相关的怪癖和陷阱……如果我遗漏了任何内容,请发表评论!
@CodesInChaos,您误会了:!!"0"
的计算结果为 true
。不过,同意==
。
【参考方案1】:
非空字符串在条件语句、条件表达式和条件构造中被视为真值。
但是当您将字符串与数字与==
进行比较时,会发生一些转换。
当比较一个数字和一个字符串时,字符串被转换为一个 数值。 JavaScript 尝试将字符串转换为数字 字面量为数字类型值。首先,导出一个数学值 从字符串数字文字。接下来,这个值被四舍五入到 最接近的 Number 类型值。
而==
没有等式的传递性:
你不能说if a == b, b == c, then a == c
。
一个例子是:
"0" == false // true
false == "\n" //true
猜猜"0" == "\n"
的结果?是的,结果是false
。
【讨论】:
提及===
会使答案更有说服力。【参考方案2】:
"0"
是一个长度为>0
的字符串,即true
。试试
0 ? 8 : 10
然后看看。它将返回10
。
==
进行类型转换,因此当你这样做时
"0" == false
它返回true
。当你这样做时
0 == "0" //true
当再次发生类型转换时,它也会返回 true。即使一个是number
,另一个是string
,它也会返回true。但是如果你使用===
,no类型转换就完成了,0 === "0"
会返回false
。
对==
和===
给出了很好的解释here。
来自docs:
相等运算符(
==
) 如果操作数不属于同一类型,则转换它们,然后应用严格比较。如果操作数严格相等且没有类型转换,则标识运算符 (
===
) 返回 true。
【讨论】:
一个非零长度的字符串。 当我输入"0" == false
时,我得到了正确的结果
@user4703663 ==
将在内部执行type conversion
,因此请使用===
。
@user4703663 对两者都有很好的解释here。【参考方案3】:
恐怕这是你应该使用===
的一个例子 - 普通的旧==
执行类型转换。试试
"0"===false
【讨论】:
但是等等,"0"===true
也产生错误。我猜这可能无法直接回答问题。
@TaoP.R.如果您想以尊重它在三元运算符中的行为方式将值转换为布尔值,请使用!!value
。如!!"0" === true
。
@Random832 Boolean()
是否完全等价? (即Boolean(x) === !!x
对于x
的所有值) - 这可能是更明确/可读/明显的方式。【参考方案4】:
JavaScript 导致大量的 WTF。
在 YouTube 上查看“Javascript WTF”...
本质上,您是在请求从字符串转换为布尔值。
这被定义为“字符串不为空”。
而您假设 javascript 执行 string -> int -> boolean 如果字符串恰好包含数字。
这是明智的。但是这些自动转换会导致编程错误,这就是为什么我更喜欢大型项目的类型安全语言(带有编译时类型检查)。
为了好玩,试试这些:
("0" * 1) ? 71 : 16
("0" + false) ? 71 : 16
【讨论】:
以上是关于为啥在三元运算符中使用“0”会返回第一个值?的主要内容,如果未能解决你的问题,请参考以下文章
为啥使用三元运算符返回字符串与在等效 if/else 块中返回的代码有很大不同?