簡(jiǎn)單介紹JavaScript數(shù)據(jù)類(lèi)型之隱式類(lèi)型轉(zhuǎn)換
JavaScript的數(shù)據(jù)類(lèi)型分為六種,分別為null,undefined,boolean,string,number,object。object是引用類(lèi)型,其它的五種是基本類(lèi)型或者是原始類(lèi)型。我們可以用typeof方法打印來(lái)某個(gè)是屬于哪個(gè)類(lèi)型的。不同類(lèi)型的變量比較要先轉(zhuǎn)類(lèi)型,叫做類(lèi)型轉(zhuǎn)換,類(lèi)型轉(zhuǎn)換也叫隱式轉(zhuǎn)換。隱式轉(zhuǎn)換通常發(fā)生在運(yùn)算符加減乘除,等于,還有小于,大于等。。
typeof '11' //string typeof(11) //number '11' < 4 //false
本章節(jié)單獨(dú)介紹一下javascript中的隱式數(shù)據(jù)類(lèi)型轉(zhuǎn)換,對(duì)于它的良好掌握,在實(shí)際應(yīng)用能夠簡(jiǎn)化很多操作。
看如下代碼實(shí)例:
var arr = [5]; console.log(arr+"");
上面的代碼就是將數(shù)組隱式轉(zhuǎn)換為字符串的一個(gè)操作,是不是要比下面的方式要簡(jiǎn)單不少:
var arr = [5]; console.log(arr.toString());
像上面類(lèi)似的隱式數(shù)據(jù)類(lèi)型轉(zhuǎn)換在實(shí)際編碼中應(yīng)用很多,下面進(jìn)入正題。
一.值類(lèi)型之間的數(shù)據(jù)類(lèi)型轉(zhuǎn)換:
javascript中的數(shù)據(jù)類(lèi)型可以參閱javascript數(shù)據(jù)類(lèi)型詳解一章節(jié)。
(1).數(shù)字和字符串使用+運(yùn)算符:
數(shù)字和字符串如果使用+運(yùn)算符進(jìn)行操作,那么會(huì)將數(shù)字先轉(zhuǎn)換為字符串,然后進(jìn)行字符串連接操作:
var antzone = "antzone"; var num = 8; console.log(antzone+num);
(2).布爾值參與的+運(yùn)算符操作:
如果有布爾型參與,那么首先會(huì)將布爾值轉(zhuǎn)換為對(duì)應(yīng)的數(shù)字或者字符串,然后再進(jìn)行相應(yīng)的字符串連接或者算數(shù)運(yùn)算。
var bool = true; var num = 8; console.log(bool + num);
上面的代碼是先將true轉(zhuǎn)換為數(shù)字1,然后再進(jìn)行算數(shù)加運(yùn)算。
var bool = true; var num = "8"; console.log(bool + num);
上面的布爾值會(huì)被轉(zhuǎn)換為對(duì)應(yīng)的字符串形式"true",然后再進(jìn)行字符串連接。
(3).減法操作:
如果進(jìn)行減法操作,那么兩個(gè)操作數(shù)都會(huì)先被轉(zhuǎn)換為數(shù)字,然后在進(jìn)行算數(shù)運(yùn)算:
var bool = true; var num = "8"; console.log(bool - num);
true會(huì)被轉(zhuǎn)換為數(shù)字1,字符串"8"會(huì)被轉(zhuǎn)換為數(shù)字8,然后進(jìn)行算術(shù)運(yùn)算。
乘,除,大于,小于跟減的轉(zhuǎn)換也是一樣,就不再舉例子了。
(4).==等性運(yùn)算:
undefined和null比較特殊,它們兩個(gè)使用==運(yùn)算符返回值是true。
console.log(undefined==null);
其他值類(lèi)型進(jìn)行比較的時(shí)候都會(huì)將運(yùn)算數(shù)轉(zhuǎn)換為數(shù)字
console.log("3"==3);
上面的代碼會(huì)將字符串"3"轉(zhuǎn)換成數(shù)字,然后再進(jìn)行比較。
console.log("1"==true);
上面的代碼會(huì)分別將"1"和true轉(zhuǎn)換成數(shù)字,然后進(jìn)行比較。
二.引用類(lèi)型轉(zhuǎn)值類(lèi)型:
引用類(lèi)型(對(duì)象)轉(zhuǎn)換為值類(lèi)型則要復(fù)雜很多,下面分布展開(kāi)介紹。
對(duì)象繼承的兩個(gè)方法可以幫助我們實(shí)現(xiàn)對(duì)象到值類(lèi)型的轉(zhuǎn)換功能:
(1).toString()方法。
(2).valueOf()方法。
通常情況下我們認(rèn)為,將一個(gè)對(duì)象轉(zhuǎn)換為字符串要調(diào)用toString()方法,轉(zhuǎn)換為數(shù)字要調(diào)用valueOf()方法,但是真正應(yīng)用的時(shí)候并沒(méi)有這么簡(jiǎn)單,看如下代碼實(shí)例:
var obj = {
webName: "腳本之家",
url:"softwhy.com"
}
console.log(obj.toString());
從上面的代碼可以看出,toString()方法并沒(méi)有將對(duì)象轉(zhuǎn)換為一個(gè)能夠反映此對(duì)象的字符串。
var arr = [1, 2, 3]; console.log(arr.valueOf());
從上面的代碼可以看出,valueOf()方法并沒(méi)有將對(duì)象轉(zhuǎn)換為能夠反映此對(duì)象的一個(gè)數(shù)字。
var arr = [1, 2, 3]; console.log(arr.toString());
數(shù)組對(duì)象的toString()方法能夠?qū)?shù)組轉(zhuǎn)換為能夠反映此數(shù)組對(duì)象的字符串。
總結(jié)如下:
(1).有些對(duì)象只是簡(jiǎn)單繼承了toString()或者valueOf()方法,比如第一個(gè)例子。
(2).有些對(duì)象則不但是繼承了兩個(gè)方法,而且還進(jìn)行了重寫(xiě)。
所以有些對(duì)象的方法能夠達(dá)成轉(zhuǎn)換成字符串或者數(shù)字的目標(biāo),有些則不能。
調(diào)用toString()或者valueOf()將對(duì)象轉(zhuǎn)換成字符串或者數(shù)字的規(guī)則如下:
調(diào)用toString()時(shí),如果對(duì)象具有這個(gè)方法,則調(diào)用此方法;如果此方法返回一個(gè)值類(lèi)型數(shù)據(jù),那么就返回這個(gè)值類(lèi)型數(shù)據(jù),然后再根據(jù)所處的上下文環(huán)境進(jìn)行相關(guān)數(shù)據(jù)類(lèi)型轉(zhuǎn)換。如果沒(méi)有toString(),或者此方法返回值并不是一個(gè)值類(lèi)型數(shù)據(jù),那么就會(huì)調(diào)用valueOf()(如果此方法存在的話(huà)),如果valueOf()返回一個(gè)值類(lèi)型數(shù)據(jù),那么再根據(jù)所處的上下文環(huán)境進(jìn)行相關(guān)的數(shù)據(jù)類(lèi)型轉(zhuǎn)換。
進(jìn)一步說(shuō)明:
(1).上面介紹了通常默認(rèn)情況下valueOf()和toString()方法的作用(將對(duì)象轉(zhuǎn)換為數(shù)字或者字符串),但是需要注意的是,這并不是硬性規(guī)定,也就是說(shuō)并不是valueOf()方法必須要返回?cái)?shù)字或者toString()方法必須要轉(zhuǎn)換為字符串,比如簡(jiǎn)單繼承的這兩個(gè)方法就無(wú)法進(jìn)行實(shí)現(xiàn)轉(zhuǎn)換為數(shù)字和字符串的功能,再比如,我們可以自己稱(chēng)謝這兩個(gè)方法,返回值也沒(méi)有必要是數(shù)字或者字符串。
(2).還有需要特別注意的一點(diǎn)就是,很多朋友認(rèn)為,轉(zhuǎn)換為字符串首先要調(diào)用toString()方法, 其實(shí)這是錯(cuò)誤的認(rèn)識(shí),我們應(yīng)該這么理解,調(diào)用toString()方法可以轉(zhuǎn)換為字符串,但不一定轉(zhuǎn)換字符串就是首先調(diào)用toString()方法。
看如下代碼實(shí)例:
var arr = [];
arr.valueOf = function () { return "1"; }
arr.toString = function () { return "2"; }
console.log(arr + "1");
上面的代碼中,arr是要被轉(zhuǎn)換為字符串的,但是很明顯是調(diào)用的valueOf()方法,而沒(méi)有調(diào)用toString()方法。有些朋友可能會(huì)有這樣的質(zhì)疑,難道[2]這樣的數(shù)字轉(zhuǎn)換成字符串"2",不是調(diào)用的toString()方法嗎。
代碼如下:
var arr = [2]; console.log(arr + "1");
其實(shí)過(guò)程是這樣的,首先arr會(huì)首先調(diào)用valueOf()方法,但是數(shù)字的此方法是簡(jiǎn)單繼承而來(lái),并沒(méi)有重寫(xiě)(當(dāng)然這個(gè)重寫(xiě)不是我們實(shí)現(xiàn)),返回值是數(shù)組對(duì)象本身,并不是一個(gè)值類(lèi)型,所以就轉(zhuǎn)而調(diào)用toString()方法,于是就實(shí)現(xiàn)了轉(zhuǎn)換為字符串的目的。
總結(jié)如下:
大多數(shù)對(duì)象隱式轉(zhuǎn)換為值類(lèi)型都是首先嘗試調(diào)用valueOf()方法。但是Date對(duì)象是個(gè)例外,此對(duì)象的valueOf()和toString()方法都經(jīng)過(guò)精心重寫(xiě),默認(rèn)是調(diào)用toString()方法,比如使用+運(yùn)算符,如果在其他算數(shù)運(yùn)算環(huán)境中,則會(huì)轉(zhuǎn)而調(diào)用valueOf()方法。
代碼實(shí)例如下:
var date = new Date(); console.log(date + "1"); console.log(date + 1); console.log(date - 1); console.log(date * 1);
以上內(nèi)容是小編給大家介紹的JavaScript數(shù)據(jù)類(lèi)型之隱式類(lèi)型轉(zhuǎn)換的全部?jī)?nèi)容,希望大家喜歡。
- 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ù)
- Javascript 類(lèi)型轉(zhuǎn)換方法
- js 變量類(lèi)型轉(zhuǎn)換常用函數(shù)與代碼[比較全]
- JS 類(lèi)型轉(zhuǎn)換常見(jiàn)方法小結(jié)
- 淺析JavaScript中的隱式類(lèi)型轉(zhuǎn)換
- JavaScript 類(lèi)型轉(zhuǎn)換的詳細(xì)實(shí)現(xiàn)
相關(guān)文章
Firefox/Chrome/Safari的中可直接使用$/$$函數(shù)進(jìn)行調(diào)試
偶然發(fā)現(xiàn)的,頁(yè)面中沒(méi)有引入Prototype和jQuery??刂婆_(tái)中敲$卻發(fā)現(xiàn)是一個(gè)函數(shù)。又試著敲$$,也是個(gè)function2012-02-02
JavaScript常用函數(shù)工具集:lao-utils
現(xiàn)在Javascript庫(kù)海量,流行的也多,比如jQuery,YUI等,雖然功能強(qiáng)大,但也是不萬(wàn)能的,功能不可能涉及方方面面,這里給大家分享一個(gè)的JS庫(kù)是對(duì)這些的補(bǔ)充,很多也比較實(shí)用,把應(yīng)用到項(xiàng)目中中去也比較方面,這也是對(duì)工作的一些積累,也加深對(duì)知識(shí)的理解。2016-03-03
基于JavaScript實(shí)現(xiàn)通用tab選項(xiàng)卡(通用性強(qiáng))
選項(xiàng)卡在大量的網(wǎng)站都有應(yīng)用,雖然形式各有不同,但是索要達(dá)成的目的都是一樣的,一般都是為了進(jìn)行分類(lèi)或者節(jié)省網(wǎng)頁(yè)空間只用,算是一件利器,下面就是一個(gè)選項(xiàng)卡的代碼實(shí)例,通用性很強(qiáng),下面就和大家分享一下2016-01-01
localStorage過(guò)期時(shí)間設(shè)置的幾種方法
聊到localStorage想必熟悉前端的朋友都不會(huì)陌生,在實(shí)際的應(yīng)用場(chǎng)景中,我們往往需要讓localStorage設(shè)置的某個(gè)key能在指定時(shí)間內(nèi)自動(dòng)失效,所以基于這種場(chǎng)景,我們?nèi)绾稳ソ鉀Q呢,本文就詳細(xì)的介紹一下2021-12-12
Js得到radiobuttonlist選中值的兩種方法(推薦)
下面小編就為大家?guī)?lái)一篇Js得到radiobuttonlist選中值的兩種方法(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-08-08
《javascript設(shè)計(jì)模式》學(xué)習(xí)筆記四:Javascript面向?qū)ο蟪绦蛟O(shè)計(jì)鏈?zhǔn)秸{(diào)用實(shí)例分析
這篇文章主要介紹了Javascript面向?qū)ο蟪绦蛟O(shè)計(jì)鏈?zhǔn)秸{(diào)用,結(jié)合實(shí)例形式分析了《javascript設(shè)計(jì)模式》中鏈?zhǔn)秸{(diào)用的原理與簡(jiǎn)單使用技巧,需要的朋友可以參考下2020-04-04

