为什么使用& 0"使用三元运算符返回第一个值

Why does using "0" with the ternary operator return the first value?

本文关键字:运算符 三元 返回 第一个 quot 为什么      更新时间:2023-09-26

我在玩JSconsole时发现了一些奇怪的东西。"0"的值为false

"0" == false
=> true

false的值在三进制中使用时返回第二个值

false ? 71 : 16
=> 16

但是,值"0"在三进制中等于false时返回第一个值。

"0" ? 8 : 10
=> 8

但是,如果使用0作为值,则返回第二个值

0 ? 4 : 5
=> 5
0 == "0"
=> true
恐怕这对我来说没有意义。

非空字符串在条件语句、条件表达式和条件构造中被认为是真值。

但是当你用==比较字符串和数字时,会发生一些转换。

当比较数字和字符串时,将字符串转换为 。JavaScript尝试将字符串转换为数字字面值转换为数字类型值。首先,推导出一个数学值从字符串数字字面值。接下来,该值四舍五入到最接近的数字类型值。

==不具有相等传递性质:

你不能说if a == b, b == c, then a == c

一个例子是:

"0" == false // true
false == "'n" //true

猜猜"0" == "'n"的结果?是的,结果是false

"0"是长度为>0的字符串,即true。试着

0 ? 8 : 10

看看。它将返回10

==执行类型转换,因此当执行

"0" == false

返回true。当你做

0 == "0" //true

当再次发生类型转换时,它也返回true。即使一个是number,另一个是string,它也返回true。但是如果您使用===没有类型转换完成,0 === "0"将返回false

== &===给出这里

docs:

相等运算符(==)对不相同类型的操作数进行转换,然后应用严格比较。

如果操作数严格相等且没有类型转换,则标识操作符(===)返回true

恐怕这是为什么你应该使用===的一个例子-普通的旧==执行类型转换。试着

"0"===false

JavaScript导致大量wtf。

查看YouTube上的"Javascript WTF"…

实际上,您正在请求从字符串到布尔值的转换

这被定义为"string is not empty"。

而你假设javascript做string -> int ->布尔如果字符串碰巧包含一个数字。

是明智的。但是这些自动转换会导致编程错误,这就是为什么我更喜欢在大型项目中使用类型安全语言(带有编译时类型检查)的原因。

为了好玩,试试这些:

("0" * 1) ? 71 : 16
("0" + false) ? 71 : 16