Javascript中3個(gè)需要注意的運(yùn)算符
平時(shí)寫慣了C#,所以會(huì)覺得什么樣的運(yùn)算符就應(yīng)該做什么樣的運(yùn)算,但是有一天你的習(xí)慣被其他語(yǔ)言顛覆了,不知道是不是有一股強(qiáng)大的好奇
心,剛好在js中,我的這種習(xí)慣就被顛覆了,下面就看看哪些運(yùn)算符顛覆了我的三觀。
一:==運(yùn)算符
==運(yùn)算符之所以可以顛覆,可以從下面幾個(gè)例子中看出來。
<1> "10"==10 ?
如果這要是放在C#里面,編譯器會(huì)毫不客氣的告訴你,王八羔子,類型都不同,你比個(gè)毛線啊。。。但是在JS里面又會(huì)是怎樣呢?

從上圖中,你可以看到,不管你好奇不好奇,答案就在那里,可能有人就要問,到底是10轉(zhuǎn)化成了“10”,還是“10”被轉(zhuǎn)化成了10,所以這個(gè)也
是我一直吐槽的地方,如果是C#,你還可以看看IL里面到底怎么處理的,而JS里面你什么都看不到,只能聽教科書上的一面之詞,無法眼見為實(shí)。
所以除了記住就是記住了,我只能說是字符串”10“轉(zhuǎn)換成了10,然后進(jìn)行整形比較的。
<2>true==1 ?
這個(gè)問題稍微想想還能理解,其實(shí)在C#的IL中,也是將true和false相應(yīng)的轉(zhuǎn)化為1和0,所以js在判斷時(shí)會(huì)將true轉(zhuǎn)化為1,再進(jìn)行整形比較,這
個(gè)現(xiàn)象我覺得不怎么稀奇,記住就好。
<3> {valueOf:function(){return "10"}}==10?
這個(gè)問題也是蠻奇葩的,對(duì)象居然還可以和int類型相比較?但是在JS中卻真的可以做到,原理是這樣的,如果一個(gè)對(duì)象和int/string比較的話,
js內(nèi)部會(huì)優(yōu)先調(diào)用valueOf方法,也就是將對(duì)象數(shù)值化,其實(shí)這里好玩的地方就是我們自定義的valueOf重寫了父類的valueOf方法,所以上面
的例子就是判斷“10”==10?。

這里還要PS一下,如果你的類中沒有定義valueOf方法的話,js內(nèi)部引擎還會(huì)再去找toString()方法,如果有則執(zhí)行。

不知道當(dāng)你接觸到這些新用法的時(shí)候,是不是覺得有點(diǎn)慌亂,好像有種亂七八糟的感覺?如果你很怕程序有潛在的bug,那么為了保險(xiǎn)起見,
轉(zhuǎn)化為同一數(shù)據(jù)類型來比較吧,當(dāng)然在js里面還有一個(gè)===運(yùn)算符可以說跟C#里面的邏輯運(yùn)算符算是最接近的,這個(gè)多出來的“=”就是在
“==”的基礎(chǔ)上再判斷類型是否相等?就比如:

二:&&和||運(yùn)算符
這兩個(gè)運(yùn)算符也是蠻奇葩的,在我們的思維習(xí)慣里面,這兩個(gè)運(yùn)算符兩邊就應(yīng)該都是bool類型,但是在JS里面這些定義會(huì)被徹底顛覆,正是這些新規(guī)則,所以我們可以完成很多新花樣,比如在jquery的源碼中,可以到處都能找到這樣的痕跡。

從圖中我們看到了這么一句,bup=b && b.parentNode,你能理解這句話的意思嗎?其實(shí)它的意思是先判斷b是否存在,如果b不存在,那
可能b就是undefined,null,0 或者NaN,如果b存在,那么就返回m.parentNode,就這么好玩,如果你用C#的話,就少不了幾個(gè)if條件了,
也算是簡(jiǎn)化代碼吧,然后再看看||操作,這個(gè)簡(jiǎn)直在源碼里面可以用泛濫來形容了,不過乍一看,特別像是C#中的可空運(yùn)算符,所以親切感倍
增,下面就拿ret=results||[]來說,如果results有值,那么ret=results,如果results為null,undefined,NaN或者0,那么result=[],就
這樣的任性,省去了程序員很多if判斷,最后要補(bǔ)充一句,其實(shí)就像C#的IL中一樣,只是JS底層給我們做了if判斷。

相關(guān)文章
javascript產(chǎn)生隨機(jī)數(shù)方法匯總
這篇文章主要介紹了javascript產(chǎn)生隨機(jī)數(shù)方法匯總的相關(guān)資料,需要的朋友可以參考下2016-01-01
JavaScript如何實(shí)現(xiàn)數(shù)組按屬性分組
在JavaScript中,有多種方法可以對(duì)數(shù)組按屬性進(jìn)行分組,這篇文章主要為大家至少介紹了6種常見的方法,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-08-08
深入理解JavaScript系列(12) 變量對(duì)象(Variable Object)
JavaScript編程的時(shí)候總避免不了聲明函數(shù)和變量,以成功構(gòu)建我們的系統(tǒng),但是解釋器是如何并且在什么地方去查找這些函數(shù)和變量呢2012-01-01
用javascript實(shí)現(xiàn)在小方框中瀏覽大圖的代碼
用javascript實(shí)現(xiàn)在小方框中瀏覽大圖的代碼...2007-08-08
簡(jiǎn)單時(shí)間提示DEMO從0開始一直進(jìn)行計(jì)時(shí)
點(diǎn)擊按鈕輸入框會(huì)從0開始一直進(jìn)行計(jì)時(shí),具體的實(shí)現(xiàn)示例如下,感興趣的朋友可以嘗試操作下哦2013-11-11
js 通過html()及text()方法獲取并設(shè)置p標(biāo)簽的顯示值
這篇文章主要介紹了js 通過html()及text()方法獲取并設(shè)置p標(biāo)簽的顯示值,需要的朋友可以參考下2014-05-05
uni-app多環(huán)境配置實(shí)現(xiàn)自動(dòng)部署的方式詳解
前后端分離開發(fā)模式中,無論前后端都有可能區(qū)分不同的環(huán)境配置,下面這篇文章主要給大家介紹了關(guān)于uni-app多環(huán)境配置實(shí)現(xiàn)自動(dòng)部署的相關(guān)資料,需要的朋友可以參考下2022-06-06

