摘要:一個(gè)不為的擴(kuò)散作為一個(gè)老司機(jī)今日卻不小心在判斷不慎掉坑了,特此記錄,并擴(kuò)散梳理一下知識(shí)點(diǎn)。后面斷點(diǎn)排查才發(fā)現(xiàn)只要一個(gè)屬性為時(shí)就可以為。值得一提的是跟的結(jié)果不一樣是因?yàn)?,的覆蓋了的。
一個(gè) null>=0 不為 false 的擴(kuò)散
作為一個(gè) javascript 老司機(jī)今日卻不小心在 boolean 判斷不慎掉坑了,特此記錄,并擴(kuò)散梳理一下知識(shí)點(diǎn)。
今天我寫了一段這樣的代碼
className={this.props.notvisitday >= 0 || this.props.visitday >=0 ? null : "active" }
在我的思維模式中 當(dāng) notvisitday 和 visitday 只有有一個(gè)是數(shù)字或者數(shù)字字符串時(shí),className 就要為 active,出乎意料的是 className 一直為 null。后面斷點(diǎn)排查才發(fā)現(xiàn) 只要一個(gè)屬性為 null 時(shí)就可以為 true。
于是我在控制臺(tái)打下這串代碼作為驗(yàn)證:
于是,我通過查閱資料加上自己的理解,有了以下判斷和總結(jié):
> >= 和 == 并不是同一層次的 boolean判斷,在""""進(jìn)行 > >= < <=判斷是比較式兩側(cè)進(jìn)行隱式轉(zhuǎn)換為number類型。
所以 null == 0 為false。
而 null >= 0 or null > 0 時(shí)候 null隱式轉(zhuǎn)換成 Number(null) 為 0。
而 Number(undefined) 和 var a={};Number(a); 則為 NaN。
此這個(gè)概念又一個(gè)大膽的想法,我又試驗(yàn)了
無一例外,用 Number方法可以強(qiáng)制換成0的都可以 >=0為真。
?。?但是,為什么連null / []都可以偏偏{}空對(duì)象不可以轉(zhuǎn)換成數(shù)字。因?yàn)?Number([]) 和 Number({}) 會(huì)首先調(diào)用各自的valueOf方法,如果沒有得到期望值就會(huì)調(diào)用toString方法,他們的toString方法的值分別為 "" , "[object Object]"`;
所以 一個(gè)為0,一個(gè)為NaN。
值得一提的是 array 跟 object 的 toString 結(jié)果不一樣是因?yàn)椋?b>Array.protptype 的 toString 覆蓋了 Object.proptype 的 toString。
如果你認(rèn)為這是胡亂猜測(cè),這里我貼上javascript高級(jí)程序的一段Number函數(shù)的轉(zhuǎn)換規(guī)則:
如果是 Boolean 值,true 和 false 分別被轉(zhuǎn)換成 1 和 0。
如果是數(shù)字值,只是簡(jiǎn)單的傳入和返回。
如果是 null 值,返回 0。
如果是 undefined ,返回 NaN。
如果是字符串,遵循下列規(guī)則:
如果字符串中只包含數(shù)字(包括前面帶正號(hào)或者負(fù)號(hào)的情況),則將其轉(zhuǎn)化為10進(jìn)制數(shù)值(注意:前導(dǎo)的0會(huì)被忽略)。
如果字符串中包含有效的浮點(diǎn)數(shù)格式,如"0.1",則將其轉(zhuǎn)換為對(duì)應(yīng)的浮點(diǎn)數(shù)值(同樣忽略前導(dǎo)0)。
如果字符串中包含有效的十六進(jìn)制格式,如"0xf",則將其轉(zhuǎn)換為相同大小的十進(jìn)制數(shù)值。
如果字符串是空的(不包含任何字符),則將其轉(zhuǎn)換為 0;
如果字符串包含除上述格式之外的字符,則將其轉(zhuǎn)換為 NaN。
如果是對(duì)象,則調(diào)用對(duì)象的valueOf()方法,然后依照前面的規(guī)則轉(zhuǎn)換為返回的值。如果轉(zhuǎn)換的結(jié)果是 NaN,則調(diào)用對(duì)象的 toString 方法,然后再次依照前面的規(guī)則轉(zhuǎn)換為返回的字符串值。
寫在最后:Number轉(zhuǎn)換的規(guī)則在某些方面的確不夠合理,但是JavaScript就是這樣一門靈活至極的語言,我們?cè)跁鴮懪袛嗍綍r(shí),千萬要對(duì)各種類型的隱式轉(zhuǎn)換小之又小心!?,在不確定的情況下 我們寧可犧牲判斷式長(zhǎng)度也不可做模凌兩可的簡(jiǎn)單判斷。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/84374.html
摘要:方法直接查找數(shù)組的位的迭代器,調(diào)用方法得到的整數(shù)即為要返回的元素。再寫迭代器的方法返回指針元素的并讓指針通過遞歸方法指向下一個(gè)元素。 Zigzag Iterator Problem Given two 1d vectors, implement an iterator to return their elements alternately. Example Given two 1d ...
摘要:數(shù)組中可以存放多個(gè)值,與大部分編程語言類似,數(shù)組元素的下標(biāo)由開始。定義數(shù)組在中,用括號(hào)來表示數(shù)組,數(shù)組元素用空格符號(hào)分割開。 簡(jiǎn)述 使用 linux 就離不開 shell,那么也就是說也離不開 shell 編程。很多時(shí)候服務(wù)器都需要編寫一些計(jì)劃任務(wù)來定時(shí)運(yùn)行的,所以掌握一些基本的 shell 編程基礎(chǔ)很有必要。 本文是我在網(wǎng)上收集的一些資料,主要目的是幫助自己更好的了解掌握 shell...
8核16g服務(wù)器一般業(yè)務(wù)能夠承受50-100的并發(fā)是沒有問題的,但是容納的并發(fā),跟很多因素有關(guān)系。所謂的高并發(fā)是針對(duì)某些大用戶量同時(shí)訪問系統(tǒng)的場(chǎng)景抽象而出的一個(gè)模糊的概念,高并發(fā)只是所有那些場(chǎng)景的統(tǒng)稱,所以不存在高并發(fā)的通用解決方案,只存在某些特定場(chǎng)景的解決方案。經(jīng)過多年N多個(gè)高并發(fā)場(chǎng)景的不斷積累,目前針對(duì)特定的高并發(fā)場(chǎng)景均有相對(duì)成熟的解決方案,但僅僅是解決方案,對(duì)于具體業(yè)務(wù)還需要具體分析。第一階...
閱讀 1268·2021-11-24 11:16
閱讀 3477·2021-11-15 11:38
閱讀 2000·2021-10-20 13:47
閱讀 593·2021-09-29 09:35
閱讀 2243·2021-09-22 15:17
閱讀 1072·2021-09-07 09:59
閱讀 3429·2019-08-30 13:21
閱讀 2944·2019-08-30 12:47