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