一個奇葩問題引起的"吐血"

某天,和某同事交流技術,他提到了一個問題:在js中,若是一個變量賦值給另外一個變量,那麼他們必定相等嗎?爲何?。而後,我脫口而出,是相等,這無毛病。變量賦值自己就只是一個定義好的變量的副本,他們相等是沒問題的,即使是引用類型的數據對象,在賦值的時候保持着內存的同一引用,它們固然也相等啊。固然注意這裏是相等,不是全等。即"=="而非"===",因此沒有什麼類型轉換的討論。不信,那咱們來兩個表明示例看看:學習

//基本類型
var a;
var b = a;
b == a;//true
//引用類型
var a = {};
var b = a;
b == a;//true,它們的引用地址相同

看起來好像是沒什麼問題的。然而事實真的是這樣嗎?spa

clipboard.png

我轉念一想,不對啊,有這麼簡單的問題?同事再給我一個例子,狠狠的打擊了我,臥槽,還能夠這樣?code

clipboard.png

js數據當中還有一個特殊的值,那就是NaN對象

var a = NaN;
var b = a;
b == a;//猜猜這裏是啥

答案真的是出乎你的意料,固然是false,也就是不相等啦。 blog

clipboard.png

不帶這麼玩的吧?ip

clipboard.png

後面腦殼一閃,原來如此,這麼低級的錯誤都犯,NaN雖然是一個數值型的值,可是它並非一個確切的值,因此NaN !== NaN。也就是說,變量的賦值也不會改變它們的不等性呢。內存

clipboard.png

還能夠這麼玩。it

ps:總結:任什麼時候候任何一個問題都不要小看它,拘束於表面,由於它隨時都會是一個坑,讓你跳進去,認真點總不會有壞處的。class

clipboard.png

鄙人建立了一個QQ羣,供你們學習交流,但願和你們合做愉快,互相幫助,交流學習,如下爲羣二維碼:變量

clipboard.png

相關文章
相關標籤/搜索