摘要:一個不為的擴散作為一個老司機今日卻不小心在判斷不慎掉坑了,特此記錄,并擴散梳理一下知識點。后面斷點排查才發現只要一個屬性為時就可以為。值得一提的是跟的結果不一樣是因為,的覆蓋了的。
一個 null>=0 不為 false 的擴散
作為一個 javascript 老司機今日卻不小心在 boolean 判斷不慎掉坑了,特此記錄,并擴散梳理一下知識點。
今天我寫了一段這樣的代碼
className={this.props.notvisitday >= 0 || this.props.visitday >=0 ? null : "active" }
在我的思維模式中 當 notvisitday 和 visitday 只有有一個是數字或者數字字符串時,className 就要為 active,出乎意料的是 className 一直為 null。后面斷點排查才發現 只要一個屬性為 null 時就可以為 true。
于是我在控制臺打下這串代碼作為驗證:
于是,我通過查閱資料加上自己的理解,有了以下判斷和總結:
> >= 和 == 并不是同一層次的 boolean判斷,在""""進行 > >= < <=判斷是比較式兩側進行隱式轉換為number類型。
所以 null == 0 為false。
而 null >= 0 or null > 0 時候 null隱式轉換成 Number(null) 為 0。
而 Number(undefined) 和 var a={};Number(a); 則為 NaN。
此這個概念又一個大膽的想法,我又試驗了
無一例外,用 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就是這樣一門靈活至極的語言,我們在書寫判斷式時,千萬要對各種類型的隱式轉換小之又小心!?,在不確定的情況下 我們寧可犧牲判斷式長度也不可做模凌兩可的簡單判斷。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/84374.html
摘要:方法直接查找數組的位的迭代器,調用方法得到的整數即為要返回的元素。再寫迭代器的方法返回指針元素的并讓指針通過遞歸方法指向下一個元素。 Zigzag Iterator Problem Given two 1d vectors, implement an iterator to return their elements alternately. Example Given two 1d ...
摘要:數組中可以存放多個值,與大部分編程語言類似,數組元素的下標由開始。定義數組在中,用括號來表示數組,數組元素用空格符號分割開。 簡述 使用 linux 就離不開 shell,那么也就是說也離不開 shell 編程。很多時候服務器都需要編寫一些計劃任務來定時運行的,所以掌握一些基本的 shell 編程基礎很有必要。 本文是我在網上收集的一些資料,主要目的是幫助自己更好的了解掌握 shell...
8核16g服務器一般業務能夠承受50-100的并發是沒有問題的,但是容納的并發,跟很多因素有關系。所謂的高并發是針對某些大用戶量同時訪問系統的場景抽象而出的一個模糊的概念,高并發只是所有那些場景的統稱,所以不存在高并發的通用解決方案,只存在某些特定場景的解決方案。經過多年N多個高并發場景的不斷積累,目前針對特定的高并發場景均有相對成熟的解決方案,但僅僅是解決方案,對于具體業務還需要具體分析。第一階...
閱讀 1201·2021-11-24 11:16
閱讀 3428·2021-11-15 11:38
閱讀 1920·2021-10-20 13:47
閱讀 546·2021-09-29 09:35
閱讀 2192·2021-09-22 15:17
閱讀 1013·2021-09-07 09:59
閱讀 3374·2019-08-30 13:21
閱讀 2904·2019-08-30 12:47