为什么使用& 0"使用三元运算符返回第一个值
Why does using "0" with the ternary operator return the first value?
我在玩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
。
==
&===
给出这里
相等运算符(
==
)对不相同类型的操作数进行转换,然后应用严格比较。如果操作数严格相等且没有类型转换,则标识操作符(
===
)返回true。
恐怕这是为什么你应该使用===
的一个例子-普通的旧==
执行类型转换。试着
"0"===false
JavaScript导致大量wtf。
查看YouTube上的"Javascript WTF"…
实际上,您正在请求从字符串到布尔值的转换。
这被定义为"string is not empty"。
而你假设javascript做string -> int ->布尔如果字符串碰巧包含一个数字。
是明智的。但是这些自动转换会导致编程错误,这就是为什么我更喜欢在大型项目中使用类型安全语言(带有编译时类型检查)的原因。
为了好玩,试试这些:
("0" * 1) ? 71 : 16
("0" + false) ? 71 : 16
- JavaScript 中三元条件和逻辑和运算符的运算符优先级
- 三元运算符检查多个字符串
- 用javascript中的三元运算符连接字符串
- 使用AngularJs数据绑定的三元运算符显示图像
- 三元运算符是NaN
- AngularJS模板中的三元运算符
- Javascript 同构三元运算符无法正确解析
- 车把中有三元运算符吗.js
- 三元运算符未执行的虚假语句
- 根据三元运算符选择函数
- 用三元运算符整理javascript
- 堆叠三元运算符在 Angularjs 表达式中不起作用
- es6javascript推荐使用三元运算符应用模板文本的方法
- 具有逻辑运算符的复杂三元运算符
- 通过三元运算符的自赋值
- 三元运算符中的表达式作为函数
- JavaScript中看似多余的三元运算符
- js:三元运算符中的多重返回
- Javascript 三元运算符结果
- 使用三元运算符缩短代码