一個 null>=0 不爲 false 的擴散

一個 null>=0 不爲 false 的擴散

做爲一個 javascript 老司機今日卻不當心在 boolean 判斷不慎掉坑了,特此記錄,並擴散梳理一下知識點。javascript

今天我寫了一段這樣的代碼java

className={this.props.notvisitday >= 0 || this.props.visitday >=0 ? null : "active" }

在個人思惟模式中 當 notvisitdayvisitday 只有有一個是數字或者數字字符串時,className 就要爲 active,出乎意料的是 className 一直爲 null。後面斷點排查才發現 只要一個屬性爲 null 時就能夠爲 true函數

因而我在控制檯打下這串代碼做爲驗證:this

clipboard.png

因而,我經過查閱資料加上本身的理解,有了如下判斷和總結:spa

  • > >=== 並非同一層次的 boolean判斷,在''''進行 > >= < <=判斷是比較式兩側進行隱式轉換爲number類型。code

  • 因此 null == 0 爲false。對象

  • null >= 0 or null > 0 時候 null隱式轉換成 Number(null)0ip

clipboard.png

  • Number(undefined)var a={};Number(a); 則爲 NaN字符串

此這個概念又一個大膽的想法,我又試驗了it

clipboard.png

無一例外,用 Number方法能夠強制換成0的均可以 >=0爲真。

!!?可是,爲何連null / []均可以恰恰{}空對象不能夠轉換成數字。

由於 Number([])Number({}) 會首先調用各自的valueOf方法,若是沒有獲得指望值就會調用toString方法,他們的toString方法的值分別爲 """[object Object]"`;
因此 一個爲0,一個爲NaN

值得一提的是 arrayobjecttoString 結果不同是由於,Array.protptypetoString 覆蓋了 Object.proptypetoString

若是你認爲這是胡亂猜想,這裏我貼上javascript高級程序的一段Number函數的轉換規則:

  • 若是是 Boolean 值,true 和 false 分別被轉換成 1 和 0。

  • 若是是數字值,只是簡單的傳入和返回。

  • 若是是 null 值,返回 0。

  • 若是是 undefined ,返回 NaN。

  • 若是是字符串,遵循下列規則:

    • 若是字符串中只包含數字(包括前面帶正號或者負號的狀況),則將其轉化爲10進制數值(注意:前導的0會被忽略)。

    • 若是字符串中包含有效的浮點數格式,如"0.1",則將其轉換爲對應的浮點數值(一樣忽略前導0)。

    • 若是字符串中包含有效的十六進制格式,如"0xf",則將其轉換爲相同大小的十進制數值。

    • 若是字符串是空的(不包含任何字符),則將其轉換爲 0;

    • 若是字符串包含除上述格式以外的字符,則將其轉換爲 NaN。

  • 若是是對象,則調用對象的valueOf()方法,而後依照前面的規則轉換爲返回的值。若是轉換的結果是 NaN,則調用對象的 toString 方法,而後再次依照前面的規則轉換爲返回的字符串值。

寫在最後:

Number轉換的規則在某些方面的確不夠合理,可是JavaScript就是這樣一門靈活至極的語言,咱們在書寫判斷式時,千萬要對各類類型的隱式轉換小之又當心!?,在不肯定的狀況下 咱們寧肯犧牲判斷式長度也不可作模凌兩可的簡單判斷。

相關文章
相關標籤/搜索