JS類型和類型判斷和類型轉(zhuǎn)換

js類型:

JavaScript中的數(shù)據(jù)類型大致分為壁酬,基本數(shù)據(jù)類型與引用數(shù)據(jù)類型

在ECMAscript數(shù)據(jù)類型有基本類型和引用類型,基本類型有Undefined右蒲、Null剧董、Boolean、Number茫负、String蕉鸳,引用類型有Object,所有的的值將會是6種的其中之一

ECMA里面有很多原生的引用類型忍法,就是查文檔的時(shí)候看見的那些:Function潮尝、Number (是對于原始類型Number的引用類型)、String(是對于原始類型String的引用類型)饿序、Date勉失、Array、Boolean(…)原探、Math乱凿、RegExp等等

在程序運(yùn)行的時(shí)候,整塊內(nèi)存可以劃分為常量池(存放基本類型的值)咽弦、棧(存放變量)徒蟆、很大的堆(存放對象)、運(yùn)行時(shí)環(huán)境(函數(shù)運(yùn)行時(shí))?

var a = 1;

var c = a;

c=2

?console.log(a); //輸出1型型,a是基本類型段审,當(dāng)執(zhí)行c=a時(shí)是值傳遞創(chuàng)建了另一個(gè)變量c

var obj1 = new Object();

obj1.value =1

var obj2 = obj1

obj2.value=2

console.log(obj1.value) //輸出2,obj1是引用類型闹蒜,當(dāng)執(zhí)行?obj2 = obj1是指針傳遞

類型判斷:

==和===:

==是值相等寺枉,===是值和類型都相等

typeof():返回類型

instanceof:?object?instanceof?constructor?

類型轉(zhuǎn)換:

強(qiáng)制類型轉(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ī)則:1顿天、如果字符串中只包含數(shù)字,則將其轉(zhuǎn)換為十進(jìn)制(忽略前導(dǎo)0)2蔑担、如果字符串中包含有效的浮點(diǎn)格式牌废,將其轉(zhuǎn)換為浮點(diǎn)數(shù)值(忽略前導(dǎo)0)3、如果是空字符串啤握,將其轉(zhuǎn)換為04鸟缕、如果字符串中包含非以上格式,則將其轉(zhuǎn)換為NaN(6)如果是對象排抬,則調(diào)用對象的valueOf()方法懂从,然后依據(jù)前面的規(guī)則轉(zhuǎn)換返回的值。如果轉(zhuǎn)換的結(jié)果是NaN蹲蒲,則調(diào)用對象的toString()方法番甩,再次依照前面的規(guī)則轉(zhuǎn)換返回的字符串值。

下表列出了對象的valueOf()的返回值:

對象返回值

Array數(shù)組的元素被轉(zhuǎn)換為字符串届搁,這些字符串由逗號分隔缘薛,連接在一起。其操作與 Array.toString 和 Array.join 方法相同咖祭。

BooleanBoolean 值掩宜。

Date存儲的時(shí)間是從 1970 年 1 月 1 日午夜開始計(jì)的毫秒數(shù) UTC。

Function函數(shù)本身么翰。

Number數(shù)字值牺汤。

Object對象本身。這是默認(rèn)情況浩嫌。

String字符串值檐迟。

下面提供幾個(gè)例子补胚,你能寫出它的正確結(jié)果嗎:

Number(“hello CSSer!”);

Number(“0×8″);

Number(“”);

Number(“020dd”);

Number(“070″);

Number(true);

2、parseInt(string, radix)函數(shù)追迟,將字符串轉(zhuǎn)換為整數(shù)類型的數(shù)值溶其。它也有一定的規(guī)則:

(1)忽略字符串前面的空格,直至找到第一個(gè)非空字符(2)如果第一個(gè)字符不是數(shù)字符號或者負(fù)號敦间,返回NaN(3)如果第一個(gè)字符是數(shù)字瓶逃,則繼續(xù)解析直至字符串解析完畢或者遇到一個(gè)非數(shù)字符號為止(4)如果上步解析的結(jié)果以0開頭,則將其當(dāng)作八進(jìn)制來解析廓块;如果以x開頭厢绝,則將其當(dāng)作十六進(jìn)制來解析(5)如果指定radix參數(shù),則以radix為基數(shù)進(jìn)行解析

小測驗(yàn):

parseInt(“hello CSSer!”);

Number(“0×8″);

parseInt(“”);

parseInt(“020dd”);

parseInt(“070″);

parseInt(“22.5″);

3带猴、parseFloat(string)函數(shù)昔汉,將字符串轉(zhuǎn)換為浮點(diǎn)數(shù)類型的數(shù)值。

它的規(guī)則與parseInt基本相同拴清,但也有點(diǎn)區(qū)別:字符串中第一個(gè)小數(shù)點(diǎn)符號是有效的靶病,另外parseFloat會忽略所有前導(dǎo)0,如果字符串包含一個(gè)可解析為整數(shù)的數(shù)口予,則返回整數(shù)值而不是浮點(diǎn)數(shù)值娄周。

4、toString(radix)方法苹威。除undefined和null之外的所有類型的值都具有toString()方法昆咽,其作用是返回對象的字符串表示。

對象操作

Array將 Array 的元素轉(zhuǎn)換為字符串牙甫。結(jié)果字符串由逗號分隔掷酗,且連接起來。

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 對象的值。

默認(rèn)返回 “[object objectname]”至朗,其中 objectname 是對象類型的名稱屉符。

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)換為布爾值东涡。

以下值會被轉(zhuǎn)換為false:false冯吓、”"、0软啼、NaN桑谍、null、undefined祸挪,其余任何值都會被轉(zhuǎn)換為true。

隱式轉(zhuǎn)換:

在某些情況下贞间,即使我們不提供顯示轉(zhuǎn)換贿条,Javascript也會進(jìn)行自動(dòng)類型轉(zhuǎn)換,主要情況有:

1增热、 用于檢測是否為非數(shù)值的函數(shù):isNaN(mix)

isNaN()函數(shù)整以,經(jīng)測試發(fā)現(xiàn),該函數(shù)會嘗試將參數(shù)值用Number()進(jìn)行轉(zhuǎn)換峻仇,如果結(jié)果為“非數(shù)值”則返回true公黑,否則返回false。

2摄咆、遞增遞減操作符(包括前置和后置)凡蚜、一元正負(fù)符號操作符

這些操作符適用于任何數(shù)據(jù)類型的值,針對不同類型的值吭从,該操作符遵循以下規(guī)則(經(jīng)過對比發(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)如果是對象漩符,先調(diào)用對象的valueOf()方法,然后對該返回值應(yīng)用前面的規(guī)則驱还。如果結(jié)果是NaN嗜暴,則調(diào)用toString()方法后再應(yīng)用前面的規(guī)則。對象變量變成數(shù)值變量议蟆。

小測驗(yàn):

分別對以下類型的值執(zhí)行后置遞增操作闷沥,結(jié)果是什么?

“2″, ”02dd”, ”", false, 22.5, +”", -false, +new Date()

3咐容、 加法運(yùn)算操作符

加號運(yùn)算操作符在Javascript也用于字符串連接符舆逃,所以加號操作符的規(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è)操作值為字符串砸抛,則:

如果兩個(gè)操作值都是字符串,則將它們拼接起來

如果只有一個(gè)操作值為字符串树枫,則將另外操作值轉(zhuǎn)換為字符串直焙,然后拼接起來

如果一個(gè)操作數(shù)是對象、數(shù)值或者布爾值团赏,則調(diào)用toString()方法取得字符串值箕般,然后再應(yīng)用前面的字符串規(guī)則。對于undefined和null舔清,分別調(diào)用String()顯式轉(zhuǎn)換為字符串丝里。

可以看出,加法運(yùn)算中体谒,如果有一個(gè)操作值為字符串類型杯聚,則將另一個(gè)操作值轉(zhuǎn)換為字符串,最后連接起來抒痒。

4幌绍、 乘除、減號運(yùn)算符、取模運(yùn)算符

這些操作符針對的是運(yùn)算傀广,所以他們具有共同性:如果操作值之一不是數(shù)值颁独,則被隱式調(diào)用Number()函數(shù)進(jìn)行轉(zhuǎn)換。具體每一種運(yùn)算的詳細(xì)規(guī)則請參考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)對于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è)操作值都是字符串敦腔,則比較字符串對應(yīng)的字符編碼值

(3)如果只有一個(gè)操作值是數(shù)值,則將另一個(gè)操作值轉(zhuǎn)換為數(shù)值恨溜,進(jìn)行數(shù)值比較

(4)如果一個(gè)操作數(shù)是對象符衔,則調(diào)用valueOf()方法(如果對象沒有valueOf()方法則調(diào)用toString()方法),得到的結(jié)果按照前面的規(guī)則執(zhí)行比較

(5)如果一個(gè)操作值是布爾值糟袁,則將其轉(zhuǎn)換為數(shù)值判族,再進(jìn)行比較

注:NaN是非常特殊的值,它不和任何類型的值相等项戴,包括它自己形帮,同時(shí)它與任何類型的值比較大小時(shí)都返回false。

7、 相等操作符(==)

相等操作符會對操作值進(jìn)行隱式轉(zhuǎn)換后進(jìn)行比較:

(1)如果一個(gè)操作值為布爾值辩撑,則在比較之前先將其轉(zhuǎn)換為數(shù)值

(2)如果一個(gè)操作值為字符串界斜,另一個(gè)操作值為數(shù)值,則通過Number()函數(shù)將字符串轉(zhuǎn)換為數(shù)值

(3)如果一個(gè)操作值是對象合冀,另一個(gè)不是各薇,則調(diào)用對象的valueOf()方法,得到的結(jié)果按照前面的規(guī)則進(jìn)行比較

(4)null與undefined是相等的

(5)如果一個(gè)操作值為NaN水慨,則相等比較返回false

(6)如果兩個(gè)操作值都是對象得糜,則比較它們是不是指向同一個(gè)對象

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市晰洒,隨后出現(xiàn)的幾起案子朝抖,更是在濱河造成了極大的恐慌,老刑警劉巖谍珊,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件治宣,死亡現(xiàn)場離奇詭異,居然都是意外死亡砌滞,警方通過查閱死者的電腦和手機(jī)侮邀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贝润,“玉大人绊茧,你說我怎么就攤上這事〈蚓颍” “怎么了华畏?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長尊蚁。 經(jīng)常有香客問我亡笑,道長,這世上最難降的妖魔是什么横朋? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任仑乌,我火速辦了婚禮,結(jié)果婚禮上琴锭,老公的妹妹穿的比我還像新娘晰甚。我一直安慰自己,他們只是感情好祠够,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布压汪。 她就那樣靜靜地躺著,像睡著了一般古瓤。 火紅的嫁衣襯著肌膚如雪止剖。 梳的紋絲不亂的頭發(fā)上腺阳,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機(jī)與錄音穿香,去河邊找鬼亭引。 笑死,一個(gè)胖子當(dāng)著我的面吹牛皮获,可吹牛的內(nèi)容都是我干的焙蚓。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼洒宝,長吁一口氣:“原來是場噩夢啊……” “哼购公!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起雁歌,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤宏浩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后靠瞎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體比庄,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年乏盐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了佳窑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡父能,死狀恐怖神凑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情何吝,我是刑警寧澤耙厚,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站岔霸,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏俯渤。R本人自食惡果不足惜呆细,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望八匠。 院中可真熱鬧絮爷,春花似錦、人聲如沸梨树。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抡四。三九已至柜蜈,卻和暖如春仗谆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背淑履。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工隶垮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人秘噪。 一個(gè)月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓狸吞,卻偏偏與公主長得像,于是被迫代替她去往敵國和親指煎。 傳聞我的和親對象是個(gè)殘疾皇子蹋偏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354