0%

JavaScript 中的if() 和 == 的奇怪行为

JavaScript真是一种奇怪的语言。

开头就是这么一句对JS性质的限定,因为之前都使用的是静态语言,强类型语言,所以对于if() 和 ==这种简单的语法并没有必要去写一篇文章,但是js的天生缺陷确会产生一些很奇怪的行为。所以特地写一篇文章来记录这些行为。

语义

首先解释语义

  • if() 用于条件判断 其中括号中需要一个boolean 表达式
  • == 用于判断 得到的结果是一个布尔表达式, 在js中是不严格判断,会先进行类型转换,然后进行比

if()的奇怪行为

1
2
3
4
5
6
7
8
9
10
11
if("a"){
console.log("a")
}

if(""){
console.log("hello")
}

if([]){
console.log("world")
}

以上的代码会怎么执行呢。可以直接去任意一个浏览器运行这些代码,查看结果。这里先抛出结论

JavaScript会把括号中的 东西转化为布尔值,之后根据结果执行

其中遵循的结果如下

类型 转换形式
Undefined false
Null False
Boolean 自己体会
number 0 +0 -0 NaN为false 其他为True
String 空字符串””为false 其他为true
Object True

所以带入就好了。根据这个原则 第一第三都可以输出,第二个是无法输出的。

那忠告是什么呢?

别这么写好吗,老老实实去写布尔表达式。

== 的奇怪行为

1
2
3
4
5
6
7
8
9
10
"" == 0
" " == 0
"" == true
"" == false
" " == false

!" " = false
!" " = true
"hello" = true
"0" = true

以上会产生什么结果?

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
2
"" == 0 // true
" " == 0 // true

按照上面说法字符串转过去其实应该是NaN啊 怎么就true了呢,说白了,如果没有这个例外,js能叫做奇怪的语言吗?所以假装他转成0了。然后去控制台试试,奥,他确实转成0了。所以表上加一条,空字符串,空白字符串(这是两个东西都是转成0)

好了有了以上的原则,转的再奇怪也不怕了。等等那下面呢

1
!" " == true

分析一下 ,” “转化为0, 那 !0是多少? 不对劲啊,这我怎么分析。机智的思考之后,这个牵扯到优先级问题,打开mdn,搜索运算符优先级。看来取非的优先级高,那我看看左边是个什么 ,别猜顺序的了,直接去控制台看看。我们得到!”” ->false。 那这个结果只能是false了 。0 和 1肯定不能相等了。

好了,以上就是这些奇怪的行为的总结。最后的忠告是什么呢?

能不能把代码写清楚点!别搞这些有的没的,这么写会被打死

伟大的编程著作都告诉我们了,代码写的别人都看不明白,你想干啥!请听大师的劝告!