摘要:但是在這個(gè)判斷的情況下,則會(huì)很神奇的發(fā)現(xiàn)打印出來了,說明此時(shí)為,為什么呢因?yàn)檫@里執(zhí)行了一個(gè)對(duì)象到布爾值的轉(zhuǎn)換故返回。
????之前做項(xiàng)目的時(shí)候,總會(huì)處理各式各樣的數(shù)據(jù),來進(jìn)行繪圖。但是當(dāng)后臺(tái)返回一個(gè)空數(shù)組的時(shí)候,頁面中并不會(huì)顯示沒有數(shù)據(jù)的圖。代碼如下:
var arr = [] if(arr){console.log(124)}else{console.log("無數(shù)據(jù)")}
我明明判斷了,怎么會(huì)不顯示呢?下面我們就來看看,具體是怎么回事。
"==" 和 "==="????比較大小,只有數(shù)字能進(jìn)行比較,所以所有比較類型最終都會(huì)轉(zhuǎn)為數(shù)字進(jìn)行。非全等(==)的情況下,只要值相同就返回True。而全等(===)的時(shí)候需要值和類型都要匹配才能返回True。即在非全等的情況下,要進(jìn)行類型轉(zhuǎn)換。全等條件下則不進(jìn)行類型轉(zhuǎn)換。
一、 非全等條件下
若兩個(gè)操作數(shù)類型相同,若值不相等,則不相等。反則相等。
若兩個(gè)操作數(shù)類型不同,若檢測相等,則需要遵循以下規(guī)則
若一個(gè)值為null,另一個(gè)為undefined,則他們相等
若一個(gè)值為數(shù)字,另一個(gè)是字符串,則會(huì)先將字符串轉(zhuǎn)換為數(shù)字,然后使用轉(zhuǎn)后的值進(jìn)行比較
若其中一個(gè)值為true,則將其轉(zhuǎn)換為1再進(jìn)行比較。若其中一個(gè)為false,則轉(zhuǎn)為0再進(jìn)行比較
若一個(gè)值是對(duì)象,另一個(gè)值是數(shù)字或字符串,則會(huì)使用valueOf(),再嘗試使用toString(),除了日期類,日期類只使用toString()轉(zhuǎn)換(注:后面會(huì)細(xì)說,先記住這些規(guī)則)
其他不同類型之間的比較均不相等。
{"a": 1} == {"a": 2} // false 1 == 1 //true null == undefined // true true == 1 //true false == 0 // true ({}) == 0 // false 解釋: ({}).valueOf 返回其本身 Object {},則然后進(jìn)行toString()轉(zhuǎn)換"[object Object]",則轉(zhuǎn)換為數(shù)字為NaN,所以{}!=0同時(shí){}!=1 [] == true // false 解釋: [].valueOf 返回其本身 [],則然后進(jìn)行toString()轉(zhuǎn)換"" 則其轉(zhuǎn)換為數(shù)字0
二、 全等條件下
若兩個(gè)值類型不相同,則他們不相等
若兩個(gè)值都是null或者undefined,則他們相等
若兩個(gè)值都是true或都是false,則他們相等
若其中一個(gè)值是NaN,或者兩個(gè)值都是NaN,則他們不相等。NaN和其他任何值都不相等,包括其本身! 通過x!==x來判斷NaN,只有在x為NaN的時(shí)候,這個(gè)表達(dá)式的值才為true。
若兩個(gè)是數(shù)字且數(shù)值相等,則他們相等。如果一個(gè)為0,另一個(gè)為-0,則他們同樣相等
若兩個(gè)值為字符串,且所含的對(duì)應(yīng)位上的數(shù)值也完全相等。則他們相等
若兩個(gè)引用值指向同一個(gè)對(duì)象、數(shù)組或函數(shù),則他們是相等的。若指向不同的對(duì)象,則他們不等,即便兩個(gè)對(duì)象具有完全一樣的屬性
例子就不一一列舉了類型轉(zhuǎn)換
????類型轉(zhuǎn)換如下:
注:基本類型(原始類型值): String、Number、Boolean、undefined、null
對(duì)于類型轉(zhuǎn)換,我們需要記住如下幾個(gè)轉(zhuǎn)換。undefined、null、0、-0、NaN、""都將轉(zhuǎn)為false。所有其他值,包括所有對(duì)象(數(shù)組)都會(huì)轉(zhuǎn)為true。那么按照這么來說,[] == true應(yīng)該返回true啊?為什么是false呢?因?yàn)樵趫?zhí)行相等判斷的時(shí)候都轉(zhuǎn)化為了數(shù)字,這兩個(gè)值是不相等。但是在if([]){console.log(1)}這個(gè)判斷的情況下,則會(huì)很神奇的發(fā)現(xiàn)打印出來了1,說明[]此時(shí)為true,為什么呢?因?yàn)檫@里執(zhí)行了一個(gè)對(duì)象到布爾值的轉(zhuǎn)換故返回true。(注:這里可以理解為對(duì)象轉(zhuǎn)為布爾值和對(duì)象轉(zhuǎn)換為數(shù)字的差異)
上面說了對(duì)象轉(zhuǎn)化為布爾值,這里再細(xì)說一下對(duì)象轉(zhuǎn)換為字符串和對(duì)象轉(zhuǎn)換為字符串
對(duì)象轉(zhuǎn)換為字符串a、如果對(duì)象具有toString()方法,則調(diào)用這個(gè)方法。如果它返回一個(gè)原始值,js將這個(gè)值轉(zhuǎn)換為字符串(若本身不是字符串),并返回這個(gè)字符串結(jié)果。
({a:1}).toString() ----> "[object Object]"
b、若對(duì)象沒有toString()方法,或者這個(gè)方法返回的不是一個(gè)原始類型值,那么js就會(huì)調(diào)用valueOf()。如果存在這個(gè)方法,則js調(diào)用它。若返回值是原始類型值,js將這個(gè)值轉(zhuǎn)換為字符串,并返回這個(gè)結(jié)果。
c、若js無法從toString()或valueOf()獲得一個(gè)原始值,則將拋出一個(gè)類型錯(cuò)誤異常
a、對(duì)象轉(zhuǎn)換為數(shù)字和對(duì)象轉(zhuǎn)換為字符串做的事一樣,但是它會(huì)先嘗試使用valueOf()
b、若對(duì)象有valueOf(),則返回一個(gè)原始值,然后js將其轉(zhuǎn)換為數(shù)字返回。否則,若有toString()方法,返回原始值,然后js將其轉(zhuǎn)換為數(shù)字返回。若兩者都沒有,則拋出一個(gè)類型錯(cuò)誤異常
[] == 0 //true 釋義:數(shù)組繼承了默認(rèn)的valueOf()方法,這個(gè)方法返回一個(gè)對(duì)象而不是一個(gè)原始類型值,因此,數(shù)組到數(shù)字的轉(zhuǎn)換則調(diào)用toString()方法??諗?shù)組轉(zhuǎn)換為空字符串,空字符串轉(zhuǎn)為數(shù)字0案例
看完上面的解釋,分析一下下面的例子
({}) == ({}) // false [] == ![] // true [] == [] // false ![] == true // false "" == "0" // false "" == 0 // true false == "false" // false false == undefined // false false == null // false
其中某個(gè)問題的解釋會(huì)牽扯到運(yùn)算符優(yōu)先級(jí)的問題。參考地址:
[https://developer.mozilla.org...
文章首發(fā)于 [http://www.17biu.cn]
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/84408.html
摘要:除非使用了分塊編碼,否則首部就是帶有實(shí)體主體的報(bào)文必須使用的。 背景 新項(xiàng)目上線, 發(fā)現(xiàn)一個(gè)奇怪的BUG, 請求接口有很小的概率返回400 Bad Request,拿到日志記錄的請求的參數(shù)于POSTMAN中測試請求接口, 發(fā)現(xiàn)能夠正常響應(yīng). 排查過程 首先服務(wù)器能夠正常響應(yīng)400 Bad Request, 排除接口故障問題. 對(duì)比日志過程中發(fā)現(xiàn) { hello:world ...
摘要:背景項(xiàng)目中通過遠(yuǎn)程調(diào)用服務(wù)框架調(diào)用了許多其它的服務(wù)其中有一個(gè)服務(wù)需要升級(jí)其升級(jí)不是版本上的升級(jí)而是整個(gè)服務(wù)重新取了一個(gè)名字使用的也是全新的包但是調(diào)用的方法沒有改變因此在升級(jí)時(shí)只是在調(diào)用服務(wù)類中修改了調(diào)用地址和調(diào)用返回實(shí)體由改為該中返回該調(diào)用 背景 項(xiàng)目中通過遠(yuǎn)程調(diào)用服務(wù)框架調(diào)用了許多其它的服務(wù),其中有一個(gè)服務(wù)wx/subscribe/contract/CircleService 需要升...
摘要:在我們向廠商提交漏洞,發(fā)布了相關(guān)的漏洞分析文章后,由于內(nèi)聯(lián)函數(shù)導(dǎo)致的類似安全問題在其他的應(yīng)用程序中陸續(xù)曝出。淺析的函數(shù)自帶了一個(gè)內(nèi)聯(lián)函數(shù)用于在應(yīng)用程序中發(fā)送電子郵件。 前言 在我們 挖掘PHP應(yīng)用程序漏洞 的過程中,我們向著名的Webmail服務(wù)提供商 Roundcube 提交了一個(gè)遠(yuǎn)程命令執(zhí)行漏洞( CVE-2016-9920 )。該漏洞允許攻擊者通過利用Roundcube接口發(fā)送一...
摘要:項(xiàng)目組長給我看了一道面試別人的面試題。打鐵趁熱,再來一道題來加深下理解。作者以樂之名本文原創(chuàng),有不當(dāng)?shù)牡胤綒g迎指出。 showImg(https://segmentfault.com/img/bVbur0z?w=600&h=400); 剛?cè)肼毿鹿?,屬于公司萌新一枚,一天下午?duì)著屏幕看代碼架構(gòu)時(shí)。BI項(xiàng)目組長給我看了一道面試別人的JS面試題。 雖然答對(duì)了,但把理由說錯(cuò)了,照樣不及格。 ...
摘要:在群里討論,然后得出了這幾種寫法,感覺是層層遞進(jìn),想了想,最后選擇發(fā)布成文章大頭兒子小頭爸爸叫去吃飯大頭兒子小頭爸爸叫去吃飯大頭兒子小頭爸爸叫去吃飯吃完了背小頭兒子回去正在牽著的手正在吃給所有對(duì)象擴(kuò)展一個(gè)繼承的方法繼承爸爸要繼承人的功能正在 在群里討論JavaScript,然后得出了這幾種寫法,感覺是層層遞進(jìn),想了想,最后選擇發(fā)布成文章 ({ baby : 大頭兒子, ...
閱讀 883·2021-09-02 09:55
閱讀 1522·2019-12-27 12:02
閱讀 1732·2019-08-30 14:24
閱讀 1151·2019-08-30 14:18
閱讀 2764·2019-08-29 13:57
閱讀 2210·2019-08-26 11:51
閱讀 1379·2019-08-26 10:37
閱讀 776·2019-08-23 16:09