Javascript類型轉(zhuǎn)換的規(guī)則實(shí)例解析
類型轉(zhuǎn)換可以分為隱式轉(zhuǎn)換和顯式轉(zhuǎn)換,所謂隱式轉(zhuǎn)換即程序在運(yùn)行時(shí)進(jìn)行的自動(dòng)轉(zhuǎn)換,顯式轉(zhuǎn)換則是人為的對(duì)類型進(jìn)行強(qiáng)制轉(zhuǎn)換。Javascript的變量是松散類型的,它可以存儲(chǔ)Javascript支持的任何數(shù)據(jù)類型,其變量的類型可以在運(yùn)行時(shí)被動(dòng)態(tài)改變。請(qǐng)看示
例:
var n = 10; n = "hello CSSer!"; n = {};
上面的示例中,首先聲明n變量并初始化其值為10(整數(shù)類型),接著將字符串“hello CSSer!”賦值給n,接著再賦一個(gè)對(duì)象給它,最后n的類型是對(duì)象類型。可以看出變量n的類型具有動(dòng)態(tài)性,實(shí)際編程中,我們建議不要頻繁改變變量的類型,因?yàn)檫@對(duì)調(diào)試沒有好處。
正因?yàn)镴avascript中變量類型具有動(dòng)態(tài)性,在程序?qū)嶋H執(zhí)行的過程中就需要用到類型轉(zhuǎn)換的概念。類型轉(zhuǎn)換可以分為隱式轉(zhuǎn)換和顯式轉(zhuǎn)換,所謂隱 式轉(zhuǎn)換即程序在運(yùn)行時(shí)進(jìn)行的自動(dòng)轉(zhuǎn)換,顯式轉(zhuǎn)換則是人為的對(duì)類型進(jìn)行強(qiáng)制轉(zhuǎn)換。本文將對(duì)Javascript的類型轉(zhuǎn)換進(jìn)行總結(jié)。
顯式轉(zhuǎn)換
通過手動(dòng)進(jìn)行類型轉(zhuǎn)換,Javascript提供了以下轉(zhuǎn)型函數(shù):
轉(zhuǎn)換為數(shù)值類型:Number(mix)、parseInt(string,radix)、parseFloat(string)
轉(zhuǎn)換為字符串類型:toString(radix)、String(mix)
轉(zhuǎn)換為布爾類型:Boolean(mix)
1、Number(mix)函數(shù),可以將任意類型的參數(shù)mix轉(zhuǎn)換為數(shù)值類型。其規(guī)則為:
1.如果是布爾值,true和false分別被轉(zhuǎn)換為1和0
2.如果是數(shù)字值,返回本身。
3.如果是null,返回0.
4.如果是undefined,返回NaN。
5.如果是字符串,遵循以下規(guī)則:
6.
1.如果字符串中只包含數(shù)字,則將其轉(zhuǎn)換為十進(jìn)制(忽略前導(dǎo)0)
2.如果字符串中包含有效的浮點(diǎn)格式,將其轉(zhuǎn)換為浮點(diǎn)數(shù)值(忽略前導(dǎo)0)
3.如果是空字符串,將其轉(zhuǎn)換為0
4.如果字符串中包含非以上格式,則將其轉(zhuǎn)換為NaN
7.如果是對(duì)象,則調(diào)用對(duì)象的valueOf()方法,然后依據(jù)前面的規(guī)則轉(zhuǎn)換返回的值。如果轉(zhuǎn)換的結(jié)果是NaN,則調(diào)用對(duì)象的toString()方法,再次依照前面的規(guī)則轉(zhuǎn)換返回的字符串值。
下表列出了對(duì)象的valueOf()的返回值:
對(duì)象 | 返回值 |
Array | 數(shù)組的元素被轉(zhuǎn)換為字符串,這些字符串由逗號(hào)分隔,連接在一起。其操作與 Array.toString 和 Array.join 方法相同。 |
Boolean | Boolean 值。 |
Date | 存儲(chǔ)的時(shí)間是從 1970 年 1 月 1 日午夜開始計(jì)的毫秒數(shù) UTC。 |
Function | 函數(shù)本身。 |
Number | 數(shù)字值。 |
Object | 對(duì)象本身。這是默認(rèn)情況。 |
String | 字符串值。 |
下面提供幾個(gè)例子,你能寫出它的正確結(jié)果嗎:
Number("hello CSSer!");//NaN Number("0x8");//8 Number("");//0 Number("020dd");//NaN Number("070");//70 Number(true);//1
2、parseInt(string, radix)函數(shù),將字符串轉(zhuǎn)換為整數(shù)類型的數(shù)值。它也有一定的規(guī)則:
1.忽略字符串前面的空格,直至找到第一個(gè)非空字符
2.如果第一個(gè)字符不是數(shù)字符號(hào)或者負(fù)號(hào),返回NaN
3.如果第一個(gè)字符是數(shù)字,則繼續(xù)解析直至字符串解析完畢或者遇到一個(gè)非數(shù)字符號(hào)為止
4.如果上步解析的結(jié)果以0開頭,則將其當(dāng)作八進(jìn)制來解析;如果以0x開頭,則將其當(dāng)作十六進(jìn)制來解析
對(duì)象 | 操作 |
Array | 將 Array 的元素轉(zhuǎn)換為字符串。結(jié)果字符串由逗號(hào)分隔,且連接起來。 |
Boolean | 如果 Boolean 值是 true,則返回 “true”。否則,返回 “false”。 |
Date | 返回日期的文字表示法。 |
Error | 返回一個(gè)包含相關(guān)錯(cuò)誤信息的字符串。 |
Function | 返回如下格式的字符串,其中 functionname 是被調(diào)用 toString 方法函數(shù)的名稱:
function functionname( ) { [native code] } |
Number | 返回?cái)?shù)字的文字表示。 |
String | 返回 String 對(duì)象的值。 |
默認(rèn) | 返回 “[object objectname]”,其中 objectname 是對(duì)象類型的名稱。 |
5.如果指定radix參數(shù),則以radix為基數(shù)進(jìn)行解析
小測(cè)驗(yàn):
parseInt("hello CSSer!");//NaN parseInt("0x8");//8 parseInt("");//NaN parseInt("020dd");//20 parseInt("070");//70 parseInt("22.5");//22
3、parseFloat(string)函數(shù),將字符串轉(zhuǎn)換為浮點(diǎn)數(shù)類型的數(shù)值。
它的規(guī)則與parseInt基本相同,但也有點(diǎn)區(qū)別:字符串中第一個(gè)小數(shù)點(diǎn)符號(hào)是有效的,另外parseFloat會(huì)忽略所有前導(dǎo)0,如果字符串包含一個(gè)可解析為整數(shù)的數(shù),則返回整數(shù)值而不是浮點(diǎn)數(shù)值。
4、toString(radix)方法。除undefined和null之外的所有類型的值都具有toString()方法,其作用是返回對(duì)象的字符串表示。
5、String(mix)函數(shù),將任何類型的值轉(zhuǎn)換為字符串,其規(guī)則為:
1.如果有toString()方法,則調(diào)用該方法(不傳遞radix參數(shù))并返回結(jié)果
2.如果是null,返回”null”
3.如果是undefined,返回”undefined”
6、Boolean(mix)函數(shù),將任何類型的值轉(zhuǎn)換為布爾值。
以下值會(huì)被轉(zhuǎn)換為false:false、”"、0、NaN、null、undefined,其余任何值都會(huì)被轉(zhuǎn)換為true。
隱式轉(zhuǎn)換
在某些情況下,即使我們不提供顯示轉(zhuǎn)換,Javascript也會(huì)進(jìn)行自動(dòng)類型轉(zhuǎn)換,主要情況有:
1. 用于檢測(cè)是否為非數(shù)值的函數(shù):isNaN(mix)
isNaN()函數(shù),經(jīng)測(cè)試發(fā)現(xiàn),該函數(shù)會(huì)嘗試將參數(shù)值用Number()進(jìn)行轉(zhuǎn)換,如果結(jié)果為“非數(shù)值”則返回true,否則返回false。
2. 遞增遞減操作符(包括前置和后置)、一元正負(fù)符號(hào)操作符
這些操作符適用于任何數(shù)據(jù)類型的值,針對(duì)不同類型的值,該操作符遵循以下規(guī)則(經(jīng)過對(duì)比發(fā)現(xiàn),其規(guī)則與Number()規(guī)則基本相同):
1.如果是包含有效數(shù)字字符的字符串,先將其轉(zhuǎn)換為數(shù)字值(轉(zhuǎn)換規(guī)則同Number()),在執(zhí)行加減1的操作,字符串變量變?yōu)閿?shù)值變量。
2.如果是不包含有效數(shù)字字符的字符串,將變量的值設(shè)置為NaN,字符串變量變成數(shù)值變量。
3.如果是布爾值false,先將其轉(zhuǎn)換為0再執(zhí)行加減1的操作,布爾值變量編程數(shù)值變量。
4.如果是布爾值true,先將其轉(zhuǎn)換為1再執(zhí)行加減1的操作,布爾值變量變成數(shù)值變量。
5.如果是浮點(diǎn)數(shù)值,執(zhí)行加減1的操作。
6.如果是對(duì)象,先調(diào)用對(duì)象的valueOf()方法,然后對(duì)該返回值應(yīng)用前面的規(guī)則。如果結(jié)果是NaN,則調(diào)用toString()方法后再應(yīng)用前面的規(guī)則。對(duì)象變量變成數(shù)值變量。
小測(cè)驗(yàn):
分別對(duì)以下類型的值執(zhí)行后置遞增操作,結(jié)果是什么?
“2″, ”02dd”, ”", false, 22.5, +”", -false, +new Date()
3. 加法運(yùn)算操作符
加號(hào)運(yùn)算操作符在Javascript也用于字符串連接符,所以加號(hào)操作符的規(guī)則分兩種情況:
•如果兩個(gè)操作值都是數(shù)值,其規(guī)則為:
1.如果一個(gè)操作數(shù)為NaN,則結(jié)果為NaN
2.如果是Infinity+Infinity,結(jié)果是Infinity
3.如果是-Infinity+(-Infinity),結(jié)果是-Infinity
4.如果是Infinity+(-Infinity),結(jié)果是NaN
5.如果是+0+(+0),結(jié)果為+0
6.如果是(-0)+(-0),結(jié)果為-0
7.如果是(+0)+(-0),結(jié)果為+0
•如果有一個(gè)操作值為字符串,則:
1.如果兩個(gè)操作值都是字符串,則將它們拼接起來
2.如果只有一個(gè)操作值為字符串,則將另外操作值轉(zhuǎn)換為字符串,然后拼接起來
3.如果一個(gè)操作數(shù)是對(duì)象、數(shù)值或者布爾值,則調(diào)用toString()方法取得字符串值,然后再應(yīng)用前面的字符串規(guī)則。對(duì)于
undefined和null,分別調(diào)用String()顯式轉(zhuǎn)換為字符串。
可以看出,加法運(yùn)算中,如果有一個(gè)操作值為字符串類型,則將另一個(gè)操作值轉(zhuǎn)換為字符串,最后連接起來。
4. 乘除、減號(hào)運(yùn)算符、取模運(yùn)算符
這些操作符針對(duì)的是運(yùn)算,所以他們具有共同性:如果操作值之一不是數(shù)值,則被隱式調(diào)用Number()函數(shù)進(jìn)行轉(zhuǎn)換。具體每一種運(yùn)算的詳細(xì)規(guī)則請(qǐng)參考ECMAScript中的定義。
5. 邏輯操作符(!、&&、||)
邏輯非(?。┎僮鞣紫韧ㄟ^Boolean()函數(shù)將它的操作值轉(zhuǎn)換為布爾值,然后求反。
邏輯與(&&)操作符,如果一個(gè)操作值不是布爾值時(shí),遵循以下規(guī)則進(jìn)行轉(zhuǎn)換:
1.如果第一個(gè)操作數(shù)經(jīng)Boolean()轉(zhuǎn)換后為true,則返回第二個(gè)操作值,否則返回第一個(gè)值(不是Boolean()轉(zhuǎn)換后的值)
2.如果有一個(gè)操作值為null,返回null
3.如果有一個(gè)操作值為NaN,返回NaN
4.如果有一個(gè)操作值為undefined,返回undefined
邏輯或(||)操作符,如果一個(gè)操作值不是布爾值,遵循以下規(guī)則:
1.如果第一個(gè)操作值經(jīng)Boolean()轉(zhuǎn)換后為false,則返回第二個(gè)操作值,否則返回第一個(gè)操作值(不是Boolean()轉(zhuǎn)換后的值)
2.對(duì)于undefined、null和NaN的處理規(guī)則與邏輯與(&&)相同
6. 關(guān)系操作符(<, >, <=, >=)
與上述操作符一樣,關(guān)系操作符的操作值也可以是任意類型的,所以使用非數(shù)值類型參與比較時(shí)也需要系統(tǒng)進(jìn)行隱式類型轉(zhuǎn)換:
1.如果兩個(gè)操作值都是數(shù)值,則進(jìn)行數(shù)值比較
2.如果兩個(gè)操作值都是字符串,則比較字符串對(duì)應(yīng)的字符編碼值
3.如果只有一個(gè)操作值是數(shù)值,則將另一個(gè)操作值轉(zhuǎn)換為數(shù)值,進(jìn)行數(shù)值比較
4.如果一個(gè)操作數(shù)是對(duì)象,則調(diào)用valueOf()方法(如果對(duì)象沒有valueOf()方法則調(diào)用toString()方法),得到的結(jié)果按照前面的
規(guī)則執(zhí)行比較
5.如果一個(gè)操作值是布爾值,則將其轉(zhuǎn)換為數(shù)值,再進(jìn)行比較
注:NaN是非常特殊的值,它不和任何類型的值相等,包括它自己,同時(shí)它與任何類型的值比較大小時(shí)都返回false。
7. 相等操作符(==)
相等操作符會(huì)對(duì)操作值進(jìn)行隱式轉(zhuǎn)換后進(jìn)行比較:
1.如果一個(gè)操作值為布爾值,則在比較之前先將其轉(zhuǎn)換為數(shù)值
2.如果一個(gè)操作值為字符串,另一個(gè)操作值為數(shù)值,則通過Number()函數(shù)將字符串轉(zhuǎn)換為數(shù)值
3.如果一個(gè)操作值是對(duì)象,另一個(gè)不是,則調(diào)用對(duì)象的valueOf()方法,得到的結(jié)果按照前面的規(guī)則進(jìn)行比較
4.null與undefined是相等的
5.如果一個(gè)操作值為NaN,則相等比較返回false
6.如果兩個(gè)操作值都是對(duì)象,則比較它們是不是指向同一個(gè)對(duì)象
- JavaScript中的object轉(zhuǎn)換成number或string規(guī)則介紹
- 詳解Javascript數(shù)據(jù)類型的轉(zhuǎn)換規(guī)則
- JavaScript中運(yùn)算符規(guī)則和隱式類型轉(zhuǎn)換示例詳解
- 學(xué)習(xí)JSON.stringify的9大特性和轉(zhuǎn)換規(guī)則
- MySQL對(duì)JSON類型字段數(shù)據(jù)進(jìn)行提取和查詢的實(shí)現(xiàn)
- MySQL中JSON字段數(shù)據(jù)類型詳解
- 詳解JavaScript如何準(zhǔn)確獲取任意變量的數(shù)據(jù)類型
- JavaScript數(shù)據(jù)類型及相互間的轉(zhuǎn)換規(guī)則
相關(guān)文章
JavaScript實(shí)現(xiàn)模態(tài)框拖拽效果
這篇文章主要介紹了通過JavaScript實(shí)現(xiàn)模態(tài)框拖拽的效果,以及鼠標(biāo)松開,可以停止拖動(dòng)模態(tài)框移動(dòng)等功能,感興趣的小伙伴可以了解一下2021-12-12webpack實(shí)現(xiàn)熱更新(實(shí)施同步刷新)
本篇文章主要介紹了webpack實(shí)現(xiàn)熱更新(實(shí)施同步刷新),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07解決WebStorm?2022.3.x?無法識(shí)別?Element?UI?2.15.11?新版本中的?el-
這篇文章主要介紹了解決?WebStorm?2022.3.x?無法識(shí)別?Element?UI?2.15.11?新版本中的?el-xxx?標(biāo)簽問題,本文給大家分享兩種解決方案,需要的朋友可以參考下2023-01-01一文教你實(shí)現(xiàn)JavaScript防抖優(yōu)化代碼
在我們前端編程中,假如我們要給后端發(fā)送請(qǐng)求,萬一手抖多點(diǎn)了幾次,多發(fā)送了幾遍怎么辦,那就得用防抖處理,下面小編就來教大家如何實(shí)現(xiàn)防抖吧2023-11-11js實(shí)現(xiàn)日期天數(shù)、時(shí)分秒的倒計(jì)時(shí)完整代碼
這篇文章主要給大家介紹了關(guān)于js實(shí)現(xiàn)日期天數(shù)、時(shí)分秒的倒計(jì)時(shí)的相關(guān)資料,實(shí)現(xiàn)倒計(jì)時(shí)功能首先是得到目標(biāo)時(shí)間,然后用當(dāng)前時(shí)間減去目標(biāo)時(shí)間,最后將時(shí)間差傳化為天數(shù)、時(shí)、分、秒,需要的朋友可以參考下2023-11-11JavaScript操作select元素和option的實(shí)例代碼
這篇文章主要介紹了JavaScript操作select元素和option的實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2016-01-01javascript實(shí)現(xiàn)checkbox復(fù)選框?qū)嵗a
這篇文章主要為大家介紹了javascript實(shí)現(xiàn)checkbox復(fù)選框?qū)嵗a,對(duì)checkbox復(fù)選框進(jìn)行美化,感興趣的小伙伴們可以參考一下2016-01-01AJAX 網(wǎng)頁保留瀏覽器前進(jìn)后退等功能
AJAX的應(yīng)用較少了頁面的刷新次數(shù),但是也可能會(huì)使瀏覽器的前進(jìn)、后退、刷新等功能受到影響。2011-02-02