成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Javascript中的類型轉(zhuǎn)換

MobService / 2788人閱讀

摘要:類型轉(zhuǎn)換法則這里討論里對不同類型進行運算的時候,是如何做類型轉(zhuǎn)換的一般是隱式轉(zhuǎn)換。轉(zhuǎn)化過程先查看對象的方法是否返回基本類型。結(jié)果轉(zhuǎn)為返回字符串。引用類型需先轉(zhuǎn)換為基本類型。后記不同類型之間的類型轉(zhuǎn)換,確實是讓人撓頭的語言。

Javascript為什么會有類型轉(zhuǎn)換

Javascirpt世界里,不推薦大量的使用try...catch...,我想大概原因:

JS里任何類型之間的算數(shù)運算,邏輯運算和位運算都不會拋異?;蛘咤e誤。例如 1/0 == Infinity, 0/0 = NaN, [ ] + 1 = "1" 等。所以catch到excepton/error的幾率,相對于編譯型語言甚至于python/ruby等動態(tài)語言,是大大地降低了。

try...catch...會在catch里轉(zhuǎn)換到一個新的作用域,catch里面調(diào)用本函數(shù)或者函數(shù)外的對象時,增加了一層作用域的查找,降低了運行效率

如果有未知的風險,確實可以try...catch...。但是如果你的代碼里有比較多的try...catch...,這就是bad smell,說明需要加強coding質(zhì)量或者重構(gòu)了。

類型轉(zhuǎn)換法則

這里討論JS里對不同類型進行運算的時候,是如何做類型轉(zhuǎn)換的(一般是隱式轉(zhuǎn)換)。

加法運算

1 + "-1" = "1-1"
基本類型之間相加時,只要其一是字符串,另外一個也會先轉(zhuǎn)換為字符串,結(jié)果就變成字符串的連接。

[ ] + 1 = "1"
引用類型和基本類型相加。引用類型先轉(zhuǎn)化為基本類型。轉(zhuǎn)化過程:先查看對象的valueOf()方法是否返回基本類型。數(shù)組的valueOf返回它本身,屬于object類型,不是基本類型。所以再調(diào)用toString方法??諗?shù)組[]的toString返回空字符串。結(jié)果轉(zhuǎn)為‘’ + 1. 返回字符串‘1’。

[ ] + { } = [object Object]
引用類型之間的加法。引用類型需先轉(zhuǎn)換為基本類型。 參考2,空數(shù)組[]轉(zhuǎn)為空字符串。類似地空對象{ } 轉(zhuǎn)換時,也先查看{ }.valueOf(). 因為 {}的valueof方法返回它自身,所以會調(diào)用{}.toString()返回‘[object Object]"。
這樣結(jié)果變成 "" + "[object Object]" = "[object Object]"

1 + null = 1
因為已經(jīng)是基本類型,而且沒有字符串,所以會基于number類型運算。 null轉(zhuǎn)為0, 結(jié)果是 1 + 0 = 1

1 + undefined = NaN
undefined 轉(zhuǎn)為NaN, so 1+ NaN = NaN

false + null = 0
都是基本類型而且沒有字符串,所以基于數(shù)字類型相加。 false轉(zhuǎn)為0, null也為0. 結(jié)果 0 + 0 = 0

[1] + [2] = "12"
分別調(diào)用toString方法以轉(zhuǎn)為基本類型,得到"1"和‘2’, "1" + "2" = "12"

加法以外的算數(shù)運算

加法以外的算數(shù)運算,如果有object類型(包括數(shù)組),先轉(zhuǎn)為基本類型,這和加法運算是相同的。轉(zhuǎn)換過程也是先查看valueOf是否返回基本類型,如果不是,就調(diào)用toString(這里假定toString都返回string。除非誰閑著沒事,非得給一對象的toString返回對象類型?)

和加法運算不同的是,轉(zhuǎn)換為基本類型后,所有的基本類型再轉(zhuǎn)為number類型,最終以number類型進行運算。

1 - "-1" = "-1"
字符串“-1”轉(zhuǎn)為number的-1, 結(jié)果1 - (-) = 2

[ ] - 1 = -1
[ ]先轉(zhuǎn)為基本類型,是空字符??兆址俎D(zhuǎn)為number為0 ,結(jié)果是0 - 1 = -1

[ ] / { }
空數(shù)組轉(zhuǎn)為基本類型是空字符,空對象轉(zhuǎn)為基本類型是[object Object],二者再分別轉(zhuǎn)為數(shù)字類型是 0 和 NaN,最終結(jié)果為0/NaN = NaN

1 / null
都已經(jīng)為基本類型,所以只要把null轉(zhuǎn)為number類型的0, 然后1 / 0 = Infinity

1 * undefined
都已經(jīng)為基本類型,所以只要把undefined轉(zhuǎn)為number類型的NaN, 然后1 * NaN = NaN

邏輯運算

1 && null = null.
因為1 是真值,則返回第二個值, 即null

null && undefined = null
返回null,因為null是falsy,則返回第一個。

0 || {} = {}
返回 {}. 因為0 是falsy,返回第二個

1 || null = 1
返回1, 因為1是真值,返回第一個

位運算

~n = -(n+1),
例如~25 = -26. 這里是帶符號的取反。如果是無符號的取反,結(jié)果就不一樣了,有興趣的可以在C語言里試試 ~25u

~null = -1
null轉(zhuǎn)為0, ~0 = -(0+1) =-1

~undefined //SyntaxError: Invalid or unexpected token

~~23.5 = 23 ~~-23.5 = -23
但 Math.floor(-23.5) = -24. 故而一般用~~取整數(shù)位

If 運算

if(-1)if (-1 == true) 是不一樣的。前者是真假判斷: -1是truthy,是真值。后者類似算術運算:先轉(zhuǎn)為number,true 轉(zhuǎn)為1, 故而 -1 == 1是假值。

小結(jié)

這里總結(jié)了js類型轉(zhuǎn)換和運行的基本規(guī)律,希望是可以滿足基本的項目需要了。

后記

JS不同類型之間的類型轉(zhuǎn)換,確實是讓人撓頭的語言。我猜想可能是JS產(chǎn)生的時候,web方興未艾,web工程師的編程功底還沒有很規(guī)范(至少沒有今天這么多資料書籍和培訓機構(gòu)等),所以js允許類型轉(zhuǎn)換,不同類型之間運算時,保證不拋異?;蛘弑M量少拋。

但是現(xiàn)在前端和后端一樣的龐大了,顯然js的這樣那樣的技法往往會使工程師掉入陷阱。typescript應允而生,一個目的是也是幫助初級工程師寫出還可以的代碼(另外一個目的估計是降低后端開發(fā)者寫前端的門檻和思維轉(zhuǎn)變)。從這角度解讀,ts也是為滿足項目工程和公司的需要。如果想深入js學習,原生的js(es5/6)是繞不開的。

補證

前面提到“try...catch...會在catch里轉(zhuǎn)換到一個新的作用域”,這是在《你不知道的JavaScript》中卷里看到的。后來感覺還是做些論證,否則老覺得不踏實??慈缦麓a:

function testException() {
    var error = "outer error"
    try {
        throw "inner error"
    } catch (error) {
        console.log(error)
        error = "modify inner error"
    }
    
    // 這里會輸出 outer error(而不是modify inner error),
    // 說明catch...里修改的error,不是testExecution()函數(shù)作用域里的,而是一個“新”作用域里的error
    // 所以我們可認為,catch...創(chuàng)建了一個新的作用域。看來它和函數(shù)作用域的類似點,都接受“參數(shù)”
    console.log(error) 
}

testException()

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

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

相關文章

  • JavaScript 中的強制類型轉(zhuǎn)換

    摘要:完整清單是中添加,此處不予介紹布爾值用來表示可能是真或假的值。結(jié)果抽象比較運算符在比較它們之前在類型之間進行自動轉(zhuǎn)換。中的隱式轉(zhuǎn)換稱為強制類型轉(zhuǎn)換,并在規(guī)范中定義。這些內(nèi)置類型可用于在不同類型之間進行顯式轉(zhuǎn)換。 翻譯:瘋狂的技術宅原文:https://www.valentinog.com/bl... 本文首發(fā)微信公眾號:前端先鋒歡迎關注,每天都給你推送新鮮的前端技術文章 show...

    endiat 評論0 收藏0
  • JavaScript 強制類型轉(zhuǎn)換

    摘要:強制類型轉(zhuǎn)換作為程序員,你一定獲取過當前系統(tǒng)的時間戳。比如對于變量而言,此次強制類型轉(zhuǎn)換是隱式的。然而則是非常典型的顯式強制類型轉(zhuǎn)換。隱式強制類型轉(zhuǎn)換大部分被詬病的強制類型轉(zhuǎn)換都是隱式強制類型轉(zhuǎn)換。 JavaScript 強制類型轉(zhuǎn)換 作為 JavaScript 程序員,你一定獲取過當前系統(tǒng)的時間戳。在 ES5 引入 Date.now() 靜態(tài)方法之前,下面這段代碼你一定不會陌生: v...

    OnlyLing 評論0 收藏0
  • 聊一聊 JS 中的『隱式類型轉(zhuǎn)換

    摘要:具體的行為取決于參數(shù)的類型。說到,就不得不提一下方法,方法自帶隱式類型轉(zhuǎn)換,該方法在測試其參數(shù)之前,會先調(diào)用方法將其轉(zhuǎn)換為數(shù)字。全等運算符會先進行數(shù)據(jù)類型判斷,并且不會發(fā)生隱式類型轉(zhuǎn)換。 類型轉(zhuǎn)換還不行?還非得隱式?這是什么高級玩意? 廢話不多說,我們先上一盤?,額,不對,先看一個例子吧。 3 + true 實際上在大多數(shù)編程語言中,都會認為上面這個表達式是錯誤的。因為布爾表達式與算術...

    Jenny_Tong 評論0 收藏0
  • JavaScript類型轉(zhuǎn)換與各種運算符

    摘要:第十七天筆記類型轉(zhuǎn)換隱式類型轉(zhuǎn)換隱式類型轉(zhuǎn)換是弱類型松散類型的在任何情況下都可以強制轉(zhuǎn)換定義類型類型以及類型的變量臥龍前端轉(zhuǎn)換為類型轉(zhuǎn)換為類型類型轉(zhuǎn)換為類型如果文本內(nèi)容是普通的文本非數(shù)字轉(zhuǎn)換后的結(jié)果為如果文本內(nèi)容是數(shù)字值轉(zhuǎn)換后的結(jié)果為對 第十七天筆記 類型轉(zhuǎn)換 隱式類型轉(zhuǎn)換 隱式類型轉(zhuǎn)換 JavaScript是弱類型/松散類型的 在任何情況下都可以強制轉(zhuǎn)換 //定義number類型 s...

    Aklman 評論0 收藏0
  • 簡單說 JavaScript中的tostring( ) 與 valueOf( )方法

    摘要:日期類定義的方法會返回它的一個內(nèi)部表示年月日以來的毫秒數(shù)。和應用的對象到原始值的轉(zhuǎn)換包含日期對象的一種特殊情形。簡單說與引發(fā)的思考簡單說通過的隱式轉(zhuǎn)換,關鍵時刻救你一命 說明 所有的對象都繼承有toString() 和 valueOf() 方法,對象到字符串,對象到數(shù)字的轉(zhuǎn)換,會通過調(diào)用待轉(zhuǎn)換對象的這兩個方法中的一個來完成。 解釋 toString( )方法的作用是: 返回一個反映這個...

    ztyzz 評論0 收藏0
  • 簡單說 JavaScript中的tostring( ) 與 valueOf( )方法

    摘要:日期類定義的方法會返回它的一個內(nèi)部表示年月日以來的毫秒數(shù)。和應用的對象到原始值的轉(zhuǎn)換包含日期對象的一種特殊情形。簡單說與引發(fā)的思考簡單說通過的隱式轉(zhuǎn)換,關鍵時刻救你一命 說明 所有的對象都繼承有toString() 和 valueOf() 方法,對象到字符串,對象到數(shù)字的轉(zhuǎn)換,會通過調(diào)用待轉(zhuǎn)換對象的這兩個方法中的一個來完成。 解釋 toString( )方法的作用是: 返回一個反映這個...

    tain335 評論0 收藏0

發(fā)表評論

0條評論

MobService

|高級講師

TA的文章

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