为啥在三元运算符中使用“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 中没有意义。 '' == 00 == '0',但'' != '0'。不要假设因为x == yxy 的行为远程相同。 这是 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 块中返回的代码有很大不同?

为啥 Swift 零合并三元运算符不返回未包装类型?

为啥我的三元运算符会出现这些错误?

在 C++ 三元运算符中使用字符串常量是对非左值数组的无效使用吗?

三元表达式是啥?