JavaScript真是一种奇怪的语言。
开头就是这么一句对JS性质的限定,因为之前都使用的是静态语言,强类型语言,所以对于if() 和 ==这种简单的语法并没有必要去写一篇文章,但是js的天生缺陷确会产生一些很奇怪的行为。所以特地写一篇文章来记录这些行为。
语义
首先解释语义
- if() 用于条件判断 其中括号中需要一个boolean 表达式
- == 用于判断 得到的结果是一个布尔表达式, 在js中是不严格判断,会先进行类型转换,然后进行比
if()的奇怪行为
1 | if("a"){ |
以上的代码会怎么执行呢。可以直接去任意一个浏览器运行这些代码,查看结果。这里先抛出结论
JavaScript会把括号中的 东西转化为布尔值,之后根据结果执行
其中遵循的结果如下
类型 | 转换形式 |
---|---|
Undefined | false |
Null | False |
Boolean | 自己体会 |
number | 0 +0 -0 NaN为false 其他为True |
String | 空字符串””为false 其他为true |
Object | True |
所以带入就好了。根据这个原则 第一第三都可以输出,第二个是无法输出的。
那忠告是什么呢?
别这么写好吗,老老实实去写布尔表达式。
== 的奇怪行为
1 | "" == 0 |
以上会产生什么结果?
emmm。。。 这我怎么知道。只能说JS真会玩
好了先上结论
x | Y | Result |
---|---|---|
null | undefiend | true |
Number | String | x==toNumber(y) |
Boolean | Any | tonumber(x) == y |
Object | String or Number | toPrimitive(x) == y |
Otherwise | Otherwise | False |
解释一下什么叫toPrimitive就是转为基本类型,特就是调用valueOf()方法和 toString()方法。valueOf的优先级比toString的优先级高。
又有人问了,那数字怎么转
Type | Result |
---|---|
Undefined | NaN |
Null | 0 |
Boolean | True -> 1, false -> 0 |
String | “abc” -> NaN, “123” -> 123, “” -> 0 |
那重点是什么呢
遇到 == ,就尝试给等号两边的表达式,变量转化为数字,转为数字之后再比较。
也有特例
1 | "" == 0 // true |
按照上面说法字符串转过去其实应该是NaN啊 怎么就true了呢,说白了,如果没有这个例外,js能叫做奇怪的语言吗?所以假装他转成0了。然后去控制台试试,奥,他确实转成0了。所以表上加一条,空字符串,空白字符串(这是两个东西都是转成0)
好了有了以上的原则,转的再奇怪也不怕了。等等那下面呢
1 | !" " == true |
分析一下 ,” “转化为0, 那 !0是多少? 不对劲啊,这我怎么分析。机智的思考之后,这个牵扯到优先级问题,打开mdn,搜索运算符优先级。看来取非的优先级高,那我看看左边是个什么 ,别猜顺序的了,直接去控制台看看。我们得到!”” ->false。 那这个结果只能是false了 。0 和 1肯定不能相等了。
好了,以上就是这些奇怪的行为的总结。最后的忠告是什么呢?
能不能把代码写清楚点!别搞这些有的没的,这么写会被打死
伟大的编程著作都告诉我们了,代码写的别人都看不明白,你想干啥!请听大师的劝告!