Javascript 類(lèi)型轉(zhuǎn)換方法
弱類(lèi)型的Javascript不會(huì)按照程序員的愿望從實(shí)際的變量類(lèi)型到所需要的數(shù)據(jù)類(lèi)型轉(zhuǎn)換,例如一個(gè)非常常見(jiàn)的錯(cuò)誤,在瀏覽器腳本中,從表單控件中獲取用戶(hù)將要輸入的一個(gè)數(shù)值類(lèi)型的變量與另一個(gè)數(shù)值變量的和。因?yàn)樽兞款?lèi)型在表單控件中是字符串類(lèi)型(計(jì)時(shí)字符串序列包含一個(gè)數(shù)字)這種嘗試將會(huì)添加那個(gè)字符串到變量,即使這些值碰巧是一些數(shù)字,結(jié)果在第二個(gè)變量將會(huì)被轉(zhuǎn)換為字符串類(lèi)型,在最后只會(huì)把從表單控件中得到的變量添加到第一個(gè)字符串末尾。
轉(zhuǎn)換到布爾類(lèi)型
當(dāng)表達(dá)式是 if 以及其他一些判斷情況時(shí),類(lèi)型轉(zhuǎn)換的結(jié)果將會(huì)是布爾型為了用于判斷。這些判斷包括邏輯運(yùn)算比如 與 (&&), 或 (||) 以及 非 (!)。 非運(yùn)算轉(zhuǎn)換變量為波爾型并且如果變量是波爾型-真。那么將返回假,反之將返回真。兩次非操作將會(huì)返回等同于變量轉(zhuǎn)換成為波爾型的值。
var boolValue = !!x;
這個(gè)技巧將會(huì)后面將會(huì)用到。
另外一種可選擇的方法就是把目標(biāo)作為參數(shù)傳遞給Boolean 構(gòu)造函數(shù)。
var boolValue = Boolean(x);
(1) 當(dāng)數(shù)值類(lèi)型轉(zhuǎn)換為布爾型時(shí),數(shù)值零將會(huì)變成假而其他數(shù)值將會(huì)變成真。除開(kāi)特殊數(shù)值 NaN (Not a Number),NaN 被用于其他類(lèi)型轉(zhuǎn)換到數(shù)值類(lèi)型時(shí)當(dāng)沒(méi)有返回一個(gè)有意義的數(shù)值時(shí)。NaN 總是返回假。 無(wú)論是無(wú)限大還是無(wú)限小或者是有限數(shù)值,只要不是零,在轉(zhuǎn)換為布爾型時(shí)總是返回true。
(2) 字符串類(lèi)型轉(zhuǎn)換規(guī)則是簡(jiǎn)單的,字符串類(lèi)型轉(zhuǎn)換到布爾型除了空字符串外都是返回真,空字符串返回假。
(3) 對(duì)于其他類(lèi)型,undefined 和 null 將會(huì)返回假,Object以及function類(lèi)型總是返回真。
當(dāng)需要判斷某一對(duì)象是否是未定義的對(duì)象時(shí),這是最有價(jià)值的功能。如果調(diào)用未定義的變量(undefined 或者 null) 將會(huì)產(chǎn)生錯(cuò)誤。當(dāng)這些都還不確定時(shí)(通常是網(wǎng)頁(yè)瀏覽器所關(guān)心的)為了避免代碼產(chǎn)生錯(cuò)誤,需要對(duì)對(duì)象進(jìn)行 if 判斷。建議把對(duì)象作為表達(dá)式,轉(zhuǎn)換為波爾型,如果返回 false 則說(shuō)明對(duì)象不存在,如果返回 true 則說(shuō)明對(duì)象存在。
if(document.documentElement){
scrollX = document.documentElement.scrollLeft;
}
兩次非操作可以判斷對(duì)象是否能被使用。
var hasDocEl = !!document.documentElement;
...
if(hasDocEl){
scrollX = document.documentElement.scrollLeft;
}
轉(zhuǎn)換到字符串類(lèi)型
另外一種可選擇的方法就是把目標(biāo)作為參數(shù)傳遞給 String 構(gòu)造函數(shù)。
var stringValue = String(x);
注意上面數(shù)值 123e-2 已經(jīng)被轉(zhuǎn)換為字符串 "1.23" ,因?yàn)橐呀?jīng)由科學(xué)計(jì)數(shù)法轉(zhuǎn)換為普通表達(dá)式了。然而,Javascript 的本質(zhì)數(shù)值類(lèi)型是來(lái)自于IEEE的雙精度浮點(diǎn)類(lèi)型,這就意味著只能儲(chǔ)存有限的精度。數(shù)學(xué)操作結(jié)果可能只能產(chǎn)生近似的值。當(dāng)他們轉(zhuǎn)換到字符串時(shí),可能會(huì)收到意想不到(指壞的)的結(jié)果。所以常常需要設(shè)置特定的定制函數(shù)用以獲得可接受的結(jié)果。這種類(lèi)型轉(zhuǎn)換機(jī)制難以保證正常結(jié)果。
當(dāng)一個(gè)對(duì)象或者函數(shù)被轉(zhuǎn)換為字符串時(shí),他們的 toString 方法將會(huì)被調(diào)用。默認(rèn)會(huì)執(zhí)行 Object.prototype.toString 以及Function.prototype.toString 除 除非重寫(xiě) "toString" 方法。把一個(gè)函數(shù)轉(zhuǎn)換到字符串,返回結(jié)果并非是必須的.Function.prototype.toString 方法就能完成大部分需要,它將會(huì)返回 "host objects" 和方法(這個(gè)對(duì)象和方法取決于不同環(huán)境,比如 DOM 元素)。
轉(zhuǎn)換到數(shù)值型
轉(zhuǎn)換到數(shù)值類(lèi)型,特別是由字符串轉(zhuǎn)換到數(shù)值類(lèi)型,有很多通用的方法,任何數(shù)學(xué)操作方法除了加法( + )都會(huì)執(zhí)行類(lèi)型轉(zhuǎn)換。所以轉(zhuǎn)換字符串類(lèi)型到數(shù)值類(lèi)型可以使之與一個(gè)數(shù)值操作,比如減去零或者乘以一。
var numValue = stringValue - 0;
/* or */
var numValue = stringValue * 1;
/* or */
var numValue = stringValue / 1;
但是 + (取正)操作還是可以轉(zhuǎn)換字符串類(lèi)型到數(shù)值類(lèi)型。因?yàn)樗蛔鋈魏斡?jì)算操作,所以這種方法是最快的。
順便一提,相反數(shù)操作 - 同樣也會(huì)執(zhí)行類(lèi)型轉(zhuǎn)換,使得目標(biāo)成為相反的結(jié)果。
var numValue = (+stringValue);
/* 這是不必要的,在 + 操作后已經(jīng)被添加了括弧,只是為了使得代碼更容易被人理解并且使得他很清楚,特別是避免了與添加和連續(xù)操作相混淆。
+ (取正)操作是最快的轉(zhuǎn)換字符串類(lèi)型到數(shù)值類(lèi)型的方法。傳遞給 Number 構(gòu)造函數(shù)一個(gè)參數(shù),它將會(huì)執(zhí)行類(lèi)型轉(zhuǎn)換并且返回一個(gè)數(shù)值類(lèi)型。
var numValue = Number(stringValue);
Number構(gòu)造函數(shù)是最慢的類(lèi)型轉(zhuǎn)換方法,但是當(dāng)速度不是所考慮的關(guān)鍵時(shí),使用它能夠使得代碼變得很干凈。
對(duì)于其他類(lèi)型,Objects 和 functions 總是被轉(zhuǎn)換為 NaN 。undefined 與 null 同樣代表沒(méi)有東西,但是只有 null 被轉(zhuǎn)換為數(shù)值零。可能是因?yàn)樗麄兿缺晦D(zhuǎn)換為波爾型,然后才轉(zhuǎn)換為數(shù)值型,在上文中轉(zhuǎn)換為波爾型的結(jié)果已經(jīng)很清楚了, null 轉(zhuǎn)換為波爾型將會(huì)返回 false 。它將會(huì)變?yōu)閿?shù)值零。他們幾乎都不必轉(zhuǎn)換為數(shù)值類(lèi)型,他們?nèi)绾芜M(jìn)行轉(zhuǎn)換的真正意義在于為了考慮一些偶然的結(jié)果,要轉(zhuǎn)換一個(gè)字符串時(shí),結(jié)果返回的是他們這些(或者是由于進(jìn)行了一些數(shù)學(xué)計(jì)算操作才返回了這些)。
parseFloat
對(duì)于 parseFloat 解析空字符串將會(huì)返回對(duì)于 parseFloat 解析空字符串將會(huì)返回 NaN ,是因?yàn)榭兆址粚儆跀?shù)字表達(dá)式。指數(shù)可以被解析,由0起頭的八進(jìn)制不會(huì)阻止字符串解析為十進(jìn)制數(shù)。十六進(jìn)制數(shù)卻因?yàn)?"x" 無(wú)法作為數(shù)字被解析而停止解析而返回一個(gè)零。
非字符串類(lèi)型轉(zhuǎn)換成為快速轉(zhuǎn)換,作為一個(gè)字符串傳遞給 parseFloat 。當(dāng)那些類(lèi)型轉(zhuǎn)換作為字符串時(shí)不在是正常的結(jié)果,它的解析結(jié)果是 NaN,Objects 和 functions 。可能有自定義 toString 方法返回字符串將會(huì)被解析成為數(shù)值,這是一個(gè)特殊的要求。
parseInt
parseInt 函數(shù)的工作方式和parseFloat 有些相似,不同之處在于它是嘗試把字符串轉(zhuǎn)換為整型數(shù)值,只能辨認(rèn)幾個(gè)少數(shù)作為數(shù)字的符號(hào)。
parseInt 函數(shù)偶爾被用作轉(zhuǎn)換單精度浮點(diǎn)數(shù)值類(lèi)型為整型。由于這種轉(zhuǎn)換首先要從字符串類(lèi)型轉(zhuǎn)換到單精度數(shù)值類(lèi)型所以是不太適用的。另外由于它會(huì)產(chǎn)生一些錯(cuò)誤,所以變得非常沒(méi)有效率,比如 2e-200 這個(gè)科學(xué)計(jì)數(shù)法的數(shù)值正確的返回因該是零,但是 parseInt 返回 2。并且由于是Javascript 格式化,數(shù)值常常返回的是一些近似值。比如 1/2 + 1/3 + 1/6 = 0.9999999999999999 ,這個(gè)表達(dá)式的結(jié)果的近似值應(yīng)該是 1 ,但 parseInt 竟會(huì)返回 0。
可以取得近似值的 Math.round,Math.ceil 和 Math.floor 都比較合適這個(gè)工作,為了取得結(jié)果,表達(dá)式將會(huì)被作為32位有符號(hào)整型,這個(gè)規(guī)則同樣適用于下面這些情況。
注 Math.round 函數(shù)執(zhí)行的是常見(jiàn)的四舍五入,0.4以及一下將會(huì)被忽略,0.5以及以上將會(huì)被加1。Math.ceil 函數(shù)在只要有小數(shù)的情況是就加1 。Math.floor 函數(shù)則無(wú)論小數(shù)大小都會(huì)被忽略。由這些函數(shù)的定義可知 parseInt 方法對(duì)于小數(shù)采取的是同 Math.floor 一樣的處理方式。
ToInt32
ToInt32 是一個(gè)內(nèi)置函數(shù),雖然很有用,但是無(wú)法像 parseInt 一樣被直接調(diào)用。用它轉(zhuǎn)換Javascript變量到數(shù)值有一些不同尋常的方式。但是它能在一些有限的情況下被使用。位操作,比如按位OR(|)和 按位AND (&) 操作數(shù)值時(shí),在使用它們操作時(shí)能被轉(zhuǎn)換為數(shù)值類(lèi)型。但是他們只工作在32位有符號(hào)的整形中,所以我們可以通過(guò)調(diào)用內(nèi)置函數(shù) ToInt32 返回已轉(zhuǎn)換的32位有符號(hào)整形變量(進(jìn)行類(lèi)型轉(zhuǎn)換)。結(jié)果就像是 parseInt 函數(shù)調(diào)用后,只是結(jié)果被限定為32位,因此都是數(shù)值,而沒(méi)有 NaN 或者 Infinity。就算是用空值進(jìn)行操作,結(jié)果返回的也是一個(gè)數(shù)值,使用一個(gè)位運(yùn)算不會(huì)印象結(jié)果,卻可以調(diào)用 ToInt32 函數(shù)。
甚至 undefined, objects 和 functions 都被轉(zhuǎn)換為 0,布爾值 true 被轉(zhuǎn)換成了數(shù)值 1。
文章作者:高維鵬(Brian)
文章出處:http://www.cnblogs.com/gaoweipeng
- Javascript將string類(lèi)型轉(zhuǎn)換int類(lèi)型
- js 數(shù)據(jù)類(lèi)型轉(zhuǎn)換總結(jié)筆記
- Javascript 強(qiáng)制類(lèi)型轉(zhuǎn)換函數(shù)
- js 變量類(lèi)型轉(zhuǎn)換常用函數(shù)與代碼[比較全]
- JS 類(lèi)型轉(zhuǎn)換常見(jiàn)方法小結(jié)
- 簡(jiǎn)單介紹JavaScript數(shù)據(jù)類(lèi)型之隱式類(lèi)型轉(zhuǎn)換
- 淺析JavaScript中的隱式類(lèi)型轉(zhuǎn)換
- JavaScript 類(lèi)型轉(zhuǎn)換的詳細(xì)實(shí)現(xiàn)
相關(guān)文章
JS實(shí)現(xiàn)將數(shù)據(jù)導(dǎo)出到Excel的方法詳解
這篇文章主要為大家介紹了JavaScript實(shí)現(xiàn)將數(shù)據(jù)導(dǎo)出到Excel的兩種方法詳解,文中的示例代碼簡(jiǎn)潔易懂,感興趣的小伙伴可以動(dòng)手嘗試一下2022-06-06js原生代碼實(shí)現(xiàn)輪播圖的實(shí)例講解
下面小編就為大家?guī)?lái)一篇js原生代碼實(shí)現(xiàn)輪播圖的實(shí)例講解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07javascript數(shù)組去重方法終極總結(jié)
這篇文章主要介紹了javascript數(shù)組去重終極總結(jié),本文列舉了3種javascript數(shù)組去重方法,并分別分析了它們的優(yōu)缺點(diǎn),需要的朋友可以參考下2014-06-06javascript實(shí)例分享---具有立體效果的圖片特效
此實(shí)例,直接粘貼代碼即可運(yùn)行,當(dāng)然圖片的路徑不要忘記改了。2014-06-06js函數(shù)參數(shù)設(shè)置默認(rèn)值的一種變通實(shí)現(xiàn)方法
js函數(shù)中有個(gè)儲(chǔ)存參數(shù)的數(shù)組arguments,因此js版支持參數(shù)默認(rèn)值的函數(shù)可以通過(guò)另外一種變通的方法實(shí)現(xiàn)2014-05-05使用純javascript實(shí)現(xiàn)放大鏡效果
本文給大家分享的是使用純javascript實(shí)現(xiàn)放大鏡效果的代碼,并附上封裝的步驟,做電商程序的小伙伴們一定不要錯(cuò)過(guò)。2015-03-03將中國(guó)標(biāo)準(zhǔn)時(shí)間轉(zhuǎn)換成標(biāo)準(zhǔn)格式的代碼
這篇文章主要介紹了將中國(guó)標(biāo)準(zhǔn)時(shí)間轉(zhuǎn)換成標(biāo)準(zhǔn)格式的方法,需要的朋友可以參考下2014-03-03微信小程序使用wxParse解析html的實(shí)現(xiàn)示例
這篇文章主要介紹了微信小程序使用wxParse解析html的實(shí)現(xiàn)示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08