null>=0
不爲 false
的擴散做爲一個 javascript 老司機今日卻不當心在 boolean 判斷不慎掉坑了,特此記錄,並擴散梳理一下知識點。javascript
今天我寫了一段這樣的代碼java
className={this.props.notvisitday >= 0 || this.props.visitday >=0 ? null : "active" }
在個人思惟模式中 當 notvisitday
和 visitday
只有有一個是數字或者數字字符串時,className
就要爲 active
,出乎意料的是 className
一直爲 null
。後面斷點排查才發現 只要一個屬性爲 null
時就能夠爲 true
。函數
因而我在控制檯打下這串代碼做爲驗證:this
因而,我經過查閱資料加上本身的理解,有了如下判斷和總結:spa
>
>=
和 ==
並非同一層次的 boolean判斷,在''''進行 > >= < <=
判斷是比較式兩側進行隱式轉換爲number類型。code
因此 null == 0
爲false。對象
而 null >= 0
or null > 0
時候 null隱式轉換成 Number(null)
爲 0
。ip
而 Number(undefined)
和 var a={};Number(a);
則爲 NaN
。字符串
此這個概念又一個大膽的想法,我又試驗了it
無一例外,用 Number
方法能夠強制換成0的均可以 >=0
爲真。
null
/ []
均可以恰恰{}
空對象不能夠轉換成數字。由於 Number([])
和 Number({})
會首先調用各自的valueOf方法,若是沒有獲得指望值就會調用toString
方法,他們的toString方法的值分別爲
"" ,
"[object Object]"`;
因此 一個爲0
,一個爲NaN
。
值得一提的是 array
跟 object
的 toString
結果不同是由於,Array.protptype
的 toString
覆蓋了 Object.proptype
的 toString
。
若是你認爲這是胡亂猜想,這裏我貼上javascript高級程序的一段
Number
函數的轉換規則:
若是是 Boolean
值,true 和 false 分別被轉換成 1 和 0。
若是是數字值,只是簡單的傳入和返回。
若是是 null 值,返回 0。
若是是 undefined ,返回 NaN。
若是是字符串,遵循下列規則:
若是字符串中只包含數字(包括前面帶正號或者負號的狀況),則將其轉化爲10進制數值(注意:前導的0會被忽略)。
若是字符串中包含有效的浮點數格式,如"0.1",則將其轉換爲對應的浮點數值(一樣忽略前導0)。
若是字符串中包含有效的十六進制格式,如"0xf",則將其轉換爲相同大小的十進制數值。
若是字符串是空的(不包含任何字符),則將其轉換爲 0;
若是字符串包含除上述格式以外的字符,則將其轉換爲 NaN。
若是是對象,則調用對象的valueOf()方法,而後依照前面的規則轉換爲返回的值。若是轉換的結果是 NaN,則調用對象的 toString 方法,而後再次依照前面的規則轉換爲返回的字符串值。
Number
轉換的規則在某些方面的確不夠合理,可是JavaScript就是這樣一門靈活至極的語言,咱們在書寫判斷式時,千萬要對各類類型的隱式轉換小之又當心!?,在不肯定的狀況下 咱們寧肯犧牲判斷式長度也不可作模凌兩可的簡單判斷。