【问题标题】:Why would ternary ("0" ? "yes" : "no") return "yes" in javascript? [duplicate]为什么三元(“0”?“yes”:“no”)会在javascript中返回“yes”? [复制]
【发布时间】:2015-01-05 23:55:04
【问题描述】:

以前可能有人问过,但我找不到。我也阅读了specs,没有看到任何奇怪的东西可以解释为什么"0" 的计算结果为true

那么为什么"0" ? "yes" : "no" 会返回yes

("0"==true) ? "yes" : "no" 按预期工作。

【问题讨论】:

  • 所以你没有看到这篇文章? stackoverflow.com/q/359494/1026459
  • @TravisJ 不,但现在我已经看到了,它仍然没有向我解释。在什么情况下"0" 会评估为true
  • @serg 我在答案中列出了链接,但这与类型强制有关。你可以在这里阅读更多信息:webreflection.blogspot.com/2010/10/…
  • 在这里也可以看到我的回答:stackoverflow.com/q/7496727/218196
  • 这是一个很好的问题,因为 (x) 和 (x==true) 应该是同一个东西,但在这种情况下它们不是。

标签: javascript ternary-operator


【解决方案1】:

非空字符串是真实的。 "0" 不是 0

但是,比较会将0 强制转换为一个数字。

注意,唯一可以在比较期间强制转换为true 的字符串是"1"。 (如果有我遗漏的边缘情况,请告诉我!)

"true" == true // false
"foo"  == true // false
"0"    == true // false
"1"    == true // true

【讨论】:

  • 字符串是真的吗? “”? ;-)
  • 但是!!"0"true
  • 那是因为Boolean("0") === true"0" !== String(true)
  • @PeterOlson:"0" !== String(true) 不是执行的比较。这是Number("0") == Number(true)
  • “注意,唯一可以强制转换为true [...]”的字符串 这不是很精确。怎么逼? Boolean("foo") 也是 true。如果您的意思是“唯一的字符串(松散地)等于值true”,那么您是对的。但是,这是因为这两个值实际上都转换为数字。在该过程中,字符串永远不会转换为布尔值。请参阅我之前的评论。
【解决方案2】:

如果一个字符串至少有一个字符,那么该字符串将评估为真。因此,您的第一个示例将返回“是”。

如果您使用了类似以下的内容,但它会返回 no:

"" ? "yes" : "no" // this evaluates to "no" since an empty string is considered falsey

这是 javascript 中类型强制发生的直接结果。我鼓励您查看以下链接以获取有关强制类型及其工作原理的更多信息:Type Coercion

【讨论】:

  • “您的第二个示例没有返回 true,因为没有发生类型强制。” 实际上确实如此。在"0" == true 中,两个值都被强制转换为数字。
猜你喜欢
  • 2011-11-16
  • 1970-01-01
  • 2020-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多