亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

聊一聊 JS 中的『隱式類型轉(zhuǎn)換』

Jenny_Tong / 832人閱讀

摘要:具體的行為取決于參數(shù)的類型。說到,就不得不提一下方法,方法自帶隱式類型轉(zhuǎn)換,該方法在測試其參數(shù)之前,會先調(diào)用方法將其轉(zhuǎn)換為數(shù)字。全等運(yùn)算符會先進(jìn)行數(shù)據(jù)類型判斷,并且不會發(fā)生隱式類型轉(zhuǎn)換。

類型轉(zhuǎn)換還不行?還非得隱式?這是什么高級玩意?

廢話不多說,我們先上一盤?,額,不對,先看一個(gè)例子吧。

3 + true

實(shí)際上在大多數(shù)編程語言中,都會認(rèn)為上面這個(gè)表達(dá)式是錯誤的。因?yàn)椴紶柋磉_(dá)式與算術(shù)運(yùn)算是不兼容的。尤其是在靜態(tài)語言中,甚至不會被運(yùn)行運(yùn)行。即使是動態(tài)語言中,通常雖然可以讓程序運(yùn)行,但是會拋出一個(gè)異常。

然而,然而, Javascript 不僅運(yùn)行程序能夠正常運(yùn)行,而且還會順利地產(chǎn)生結(jié)果 4。Javascript 真的是對類型錯誤出奇的寬容啊??雌饋砗芟袷且患檬聦Σ粚Γ?/p>

基本上,在 Javascript 中,只有在一些極少數(shù)情況下才會因?yàn)轭愋湾e誤而拋出一個(gè)異常。諸如: 調(diào)用非函數(shù)對象或者獲取 null / undefined 的屬性時(shí)。

但是在大多數(shù)情況下,Javascript 都是不會拋出異常的。這個(gè)『小婊砸』反而按照多種多樣的轉(zhuǎn)換協(xié)議偷偷的強(qiáng)制轉(zhuǎn)換為她期望的值。諾,你看,還花樣轉(zhuǎn)換呢,真會玩嘛。這就是所謂的『隱式類型轉(zhuǎn)換』。

那么,上面那個(gè)例子中,究竟是發(fā)生了什么樣的轉(zhuǎn)換方式呢?

首先,Javascript 這個(gè)『小婊砸』在遇到算數(shù)運(yùn)算符(- 、* 、/%)的時(shí)候會在運(yùn)算之前將參與運(yùn)算的雙方轉(zhuǎn)換成數(shù)字。

那么問題又來了,true 怎么就轉(zhuǎn)換成數(shù)字了呢?實(shí)際上我們通過 Number(true) 就可以看到, true 轉(zhuǎn)換為數(shù)字之后就是為 1,相反,false 轉(zhuǎn)換為數(shù)字之后就對應(yīng)為 0。

細(xì)心的你可能發(fā)現(xiàn)我在上面并沒有提到 + 運(yùn)算符,那是因?yàn)樗鼜?fù)雜。因?yàn)樗瘸袚?dān)著數(shù)字相加,又肩負(fù)著字符串連接操作的重任。具體的行為取決于參數(shù)的類型。

但是,如果一個(gè)數(shù)字和一個(gè)字符串相加,會碰撞出什么樣的火花呢?

顯然 Javascript 這個(gè)『小婊砸』更偏愛字符串多一點(diǎn),她會將數(shù)字(toString())轉(zhuǎn)換為字符串,然后執(zhí)行字符串連接操作。

例如:

"1" + 2;    // "12"
1 + "2";    // "12"

但是,注意,Javascript 對操作順序非常敏感,以至于會發(fā)生這樣的事情:

1 + 2 + "3";    // "33"

因?yàn)榧臃ㄟ\(yùn)算是自左向右的,因此它等同于下面的表達(dá)式:

(1 + 2) + "3";    // "33"

再來看這一個(gè)例子:

if (1 == true) {
    alert("true");
} else {
    alert("false");
}    

相信你一定輕松的猜到了結(jié)果對不對?

但是,哼,你以為我的問題會這么簡單么?那豈不是太小看你了。

我們都知道,Javascript 中,數(shù)字 0 為假,非0 均為真, 那么我想問的是,在上面的條件語句中,到底是 1 被隱式類型轉(zhuǎn)換了呢還是 true 被隱式類型轉(zhuǎn)換了呢?

實(shí)際上在條件判斷運(yùn)算 == 中的轉(zhuǎn)換規(guī)則是這樣的:

如果比較的兩者中有布爾值(Boolean),會把 Boolean 先轉(zhuǎn)換為對應(yīng)的 Number,即 0 和 1,然后進(jìn)行比較。

如果比較的雙方中有一方為 Number,一方為 String時(shí),會把 String 通過 Number() 方法轉(zhuǎn)換為數(shù)字,然后進(jìn)行比較。

如果比較的雙方中有一方為 Boolean,一方為 String時(shí),會將雙方轉(zhuǎn)換為數(shù)字,然后再進(jìn)行比較。

如果比較的雙方中有一方為 Number,一方為Object時(shí),則會調(diào)用 valueOf 方法將Object轉(zhuǎn)換為數(shù)字,然后進(jìn)行比較。

例如:

1 == { valueOf: function() {return 1;} }    // true
1 + { valueOf: function() {return 1;} }    // 2

需要強(qiáng)調(diào)的是,在 Javascript 中,只有 空字符串數(shù)字0、falsenull、undefinedNaN 這 6 個(gè)值為假之外,其他所有的值均為真值。

說到 NaN,就不得不提一下 isNaN() 方法,isNaN() 方法自帶隱式類型轉(zhuǎn)換,該方法在測試其參數(shù)之前,會先調(diào)用 Number() 方法將其轉(zhuǎn)換為數(shù)字。所以 isNaN("1") 這個(gè)語句中明明用一個(gè)字符串去測試,返回值仍然為 false 也就不足為怪了。

+ 號運(yùn)算中還有一種更復(fù)雜的情況,那就是數(shù)字/字符串和對象進(jìn)行運(yùn)算的時(shí)候,上面已經(jīng)舉例說明了數(shù)字和對象運(yùn)算的情況,我們再來說一下字符串和對象運(yùn)算的情況。

當(dāng)字符串和對象進(jìn)行 + 運(yùn)算的時(shí)候,Javascript 會通過對象的 toString() 方法將其自身轉(zhuǎn)換為字符串,然后進(jìn)行連接操作。

"1" + { toString: function() {return 1;} }    // "11"

之所以說它特殊,是因?yàn)楫?dāng)一個(gè)對象同時(shí)包含 toString()valueOf() 方法的時(shí)候,運(yùn)算符 + 應(yīng)該調(diào)用哪個(gè)方法并不明顯(做字符串連接還是加法應(yīng)該根據(jù)其參數(shù)類型,但是由于隱式類型轉(zhuǎn)換的存在,類型并不顯而易見。),Javascript 會盲目的選擇 valueOf() 方法而不是 toString() 來解決這個(gè)問題。這就意味著如果你打算對一個(gè)對象做字符串連接的操作,但結(jié)果卻是......

var obj = {
    toString: function() { return "Object CustomObj"; },
    valueOf: function() { return 1; }
};

console.log("Object: " + obj);    // "Object: 1"

隱式類型轉(zhuǎn)換會給我們造成很多麻煩,那么該怎么避免呢?

建議在所有使用條件判斷的時(shí)候都使用全等運(yùn)算符 === 來進(jìn)行條件判斷。全等運(yùn)算符會先進(jìn)行數(shù)據(jù)類型判斷,并且不會發(fā)生隱式類型轉(zhuǎn)換。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/78746.html

相關(guān)文章

  • JavaScript 類型轉(zhuǎn)換深度學(xué)習(xí)

    摘要:當(dāng)一個(gè)值為字符串,另一個(gè)值為非字符串,則后者轉(zhuǎn)為字符串。文章出自的個(gè)人博客 showImg(https://segmentfault.com/img/bVEWkS?w=3376&h=1312); JavaScript 是一門弱類型語言,剛接觸的時(shí)候感覺方便快捷(不需要聲明變量類型了耶?。?,接觸久了會發(fā)現(xiàn)它帶來的麻煩有的時(shí)候不在預(yù)期之內(nèi) 呵呵一笑,哪有這么夸張,可能有人看過這樣一段代碼 ...

    microcosm1994 評論0 收藏0
  • 一聊js中 0.1 + 0.2 != 0.3

    摘要:中數(shù)字存儲使用的是位雙精度浮點(diǎn)數(shù)在計(jì)算機(jī)中存儲為位符號位正數(shù)負(fù)數(shù)指數(shù)位用來確定范圍尾數(shù)位用來確定精度轉(zhuǎn)成十進(jìn)制表示法為符號位指數(shù)位尾數(shù)位偏正值使得指數(shù)位真實(shí)取值為而非目的是為了方便比較大小實(shí)際指數(shù)值階碼偏正值階碼指數(shù)的移碼移碼與補(bǔ) Javascript中數(shù)字存儲使用的是IEEE754 64位雙精度浮點(diǎn)數(shù) 在計(jì)算機(jī)中存儲為64位1 11 521: 符號位 0正數(shù) 1負(fù)數(shù)11: 指數(shù)位 用...

    dingda 評論0 收藏0
  • [一聊系列]一聊前端模板與渲染那些事兒

    摘要:歡迎大家收看聊一聊系列,這一套系列文章,可以幫助前端工程師們了解前端的方方面面不僅僅是代碼作為現(xiàn)代應(yīng)用,的大量使用,使得前端工程師們?nèi)粘5拈_發(fā)少不了拼裝模板,渲染模板。我們今天就來聊聊,拼裝與渲染模板的那些事兒。一改俱改,一板兩用。 歡迎大家收看聊一聊系列,這一套系列文章,可以幫助前端工程師們了解前端的方方面面(不僅僅是代碼):https://segmentfault.com/blog...

    UCloud 評論0 收藏0
  • [一聊系列]一聊前端模板與渲染那些事兒

    摘要:歡迎大家收看聊一聊系列,這一套系列文章,可以幫助前端工程師們了解前端的方方面面不僅僅是代碼作為現(xiàn)代應(yīng)用,的大量使用,使得前端工程師們?nèi)粘5拈_發(fā)少不了拼裝模板,渲染模板。我們今天就來聊聊,拼裝與渲染模板的那些事兒。一改俱改,一板兩用。 歡迎大家收看聊一聊系列,這一套系列文章,可以幫助前端工程師們了解前端的方方面面(不僅僅是代碼):https://segmentfault.com/blog...

    Yangder 評論0 收藏0
  • [一聊系列]一聊前端模板與渲染那些事兒

    摘要:歡迎大家收看聊一聊系列,這一套系列文章,可以幫助前端工程師們了解前端的方方面面不僅僅是代碼作為現(xiàn)代應(yīng)用,的大量使用,使得前端工程師們?nèi)粘5拈_發(fā)少不了拼裝模板,渲染模板。我們今天就來聊聊,拼裝與渲染模板的那些事兒。一改俱改,一板兩用。 歡迎大家收看聊一聊系列,這一套系列文章,可以幫助前端工程師們了解前端的方方面面(不僅僅是代碼):https://segmentfault.com/blog...

    褰辯話 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<