JavaScript高級(jí)程序設(shè)計(jì)(第3版)學(xué)習(xí)筆記3 js簡(jiǎn)單數(shù)據(jù)類型
簡(jiǎn)單數(shù)據(jù)類型
簡(jiǎn)單數(shù)據(jù)類型 | 取值 |
Undefined | undefined(只有一個(gè)值) |
Null | null(只有一個(gè)值) |
Boolean | true|false(只有兩個(gè)值) |
Number | 數(shù)值 |
String | 字符串 |
首先需要說(shuō)明的是,在ECMAScript中,上述5種簡(jiǎn)單數(shù)據(jù)類型,其中Boolean、Number、String都有同名的內(nèi)置包裝對(duì)象,而簡(jiǎn)單數(shù)據(jù)類型的字面值(變量)會(huì)根據(jù)情況自動(dòng)包箱,從而可以直接調(diào)用方法,至于具體可以調(diào)用哪些方法,在討論內(nèi)置對(duì)象時(shí)再詳細(xì)說(shuō)明:
console.info(true.toString());//true,相當(dāng)于使用Boolean()包裝之后再調(diào)用
console.info(Boolean(false).toString());//false,將false轉(zhuǎn)換為Boolean類型值
console.info(new Boolean(false).toString());//false,將false使用Boolean()包裝
console.info(false.toString());//false,相當(dāng)于使用Boolean()包裝之后再調(diào)用
console.info('test'.toString());//test,相當(dāng)于使用String()包裝之后再調(diào)用
try{
console.info(undefined.toString());//沒(méi)有相應(yīng)包裝類型,拋出異常
}catch(e){
console.info(e);//TypeError
}
try{
console.info(null.toString());//沒(méi)有相應(yīng)包裝類型,拋出異常
}catch(e){
console.info(e);//TypeError
}
var num = 4;
console.info(num.toString());//4,可以直接在簡(jiǎn)單數(shù)值變量上調(diào)用方法,相當(dāng)于使用Number()包裝之后再調(diào)用
//console.info(3.toString());//SyntaxError,語(yǔ)法錯(cuò)誤不能使用try捕獲,說(shuō)明不能直接在數(shù)值字面量上調(diào)用
其次說(shuō)一下實(shí)際用的最多的數(shù)據(jù)轉(zhuǎn)換:
?。?)轉(zhuǎn)換為Boolean:!!value
?。?)轉(zhuǎn)換為Number:+value
?。?)轉(zhuǎn)換為String:''+value
下面再具體說(shuō)明5種簡(jiǎn)單數(shù)據(jù)類型:
1、Undefined類型
Undefined數(shù)據(jù)類型只有一個(gè)取值:undefined。
(1)所有未初始化的值都默認(rèn)為undefined(也就沒(méi)有必要把一個(gè)變量顯示初始化為undefined了)。
(2)在函數(shù)作用域中,沒(méi)有傳入實(shí)際參數(shù)的函數(shù)形參為undefined。
(3)函數(shù)沒(méi)有明確返回或者return;的時(shí)候,返回值為undefined。
(4)在ECMAScript中,規(guī)定null==undefined返回true,而null===undefined返回false。
(5)undefined相應(yīng)的Boolean值為false。
(6)使用typeof作用于undefiend時(shí),返回字符串'undefined',作用于一個(gè)從未聲明的“變量”時(shí),也會(huì)返回'undefined'。
(7)undefined轉(zhuǎn)換數(shù)值為NaN,轉(zhuǎn)換字符串為'undefined'。
console.info(undefined===undefined);//true
console.info(typeof undefined);//undefined
console.info(typeof noDefined);//undefined,未定義的標(biāo)識(shí)符,使用typeof也返回undefined,這也是未定義的標(biāo)識(shí)符唯一可用的的操作符
console.info(!undefined);//true,這里返回true,正是很多條件語(yǔ)句中判斷變量是否初始化的基礎(chǔ)
console.info(!!undefined);//任何一個(gè)值,使用雙重否定!!都會(huì)將其轉(zhuǎn)換為相應(yīng)的Boolean值,這里說(shuō)明undefiend相應(yīng)的Boolean值為false
console.info(undefined==null);//ES中規(guī)定,null與undefined相等性測(cè)試返回true
console.info(undefined===null);//但undefined與null畢竟是兩個(gè)數(shù)據(jù)類型,使用全等比較時(shí),返回false
console.info(typeof undefined==undefined);//false,typeof undefined返回的是一個(gè)字符串'undefined',所以這里輸出false
console.info(+undefined);//NaN,轉(zhuǎn)換數(shù)值時(shí)為NaN
console.info(''+undefined);//undefined,轉(zhuǎn)換為字符串'undefined'
2、Null類型
Null類型也只有一個(gè)值:null。
(1)對(duì)null值使用typeof時(shí),返回字符串'object'。
(2)null相應(yīng)的Boolean值為false。
(3)如果一個(gè)變量用于保存一個(gè)對(duì)象,建議初始化為null。
(4)null轉(zhuǎn)換數(shù)值為0,轉(zhuǎn)換字符串為'null'。
console.info(null===null);//true
console.info(typeof null);//object
console.info(!null);//true
console.info(!!null);//false,說(shuō)明null相應(yīng)的Boolean值為false
console.info(undefined==null);//true
console.info(undefined===null);//false
console.info(+null);//0,轉(zhuǎn)換為數(shù)值0
console.info(''+null);//null,轉(zhuǎn)換為字符串'null'
3、Boolean類型
Boolean類型只有兩個(gè)值:true和false。
(1)雖然只有兩個(gè)值,但是任何一種數(shù)據(jù)類型的值都能轉(zhuǎn)換為與其相對(duì)應(yīng)的Boolean值,轉(zhuǎn)換方式主要有三種:
A、通過(guò)轉(zhuǎn)型函數(shù)Boolean()轉(zhuǎn)換
需要注意的是,當(dāng)Boolean()作為轉(zhuǎn)換函數(shù)時(shí),會(huì)轉(zhuǎn)換為一個(gè)與其相應(yīng)的Boolean值,當(dāng)作為構(gòu)造函數(shù)時(shí),會(huì)創(chuàng)建一個(gè)對(duì)象,而任意非空對(duì)象的Boolean值都是true,有時(shí)候這會(huì)造成誤解,建議就是不使用Boolean()。對(duì)于String()、Number()也有類似情況。
B、通過(guò)雙重否定!!操作符轉(zhuǎn)換
C、通過(guò)隱式轉(zhuǎn)換,比如一些條件語(yǔ)句中
(2)Boolean類型的true和false,使用typeof時(shí),均返回字符串'boolean'。
(3)在轉(zhuǎn)換為數(shù)值時(shí),true和false分別轉(zhuǎn)換為1和0,轉(zhuǎn)換為字符串時(shí),分別為'true'和'false'。
var value = 'test';
var empty = '';
console.info(!!value);//true
console.info(!!empty);//false
console.info(Boolean(value));//true
console.info(Boolean(empty));//false
console.info(!!value === Boolean(value));//true,說(shuō)明兩種轉(zhuǎn)換方式等價(jià)
console.info(!!empty === Boolean(empty));//true
console.info(new Boolean(value));//Boolean對(duì)象,注意這里使用了new,會(huì)創(chuàng)建一個(gè)對(duì)象
console.info(new Boolean(empty));//Boolean對(duì)象
if(value){//隱式轉(zhuǎn)換為true
console.info(value);//test
}
if(empty){//隱式轉(zhuǎn)換為false,不執(zhí)行括號(hào)內(nèi)部語(yǔ)句
console.info('empty');
}
if(new Boolean(empty)){//先創(chuàng)建對(duì)象,再隱式轉(zhuǎn)換為true,會(huì)執(zhí)行括號(hào)內(nèi)部的語(yǔ)句
console.info('empty');//empty
}
console.info(typeof true == 'boolean');//true
console.info(+true);//1,一元操作符,轉(zhuǎn)換為數(shù)值1
console.info(+false);//0
console.info(''+true);//true,重載后的+操作符,轉(zhuǎn)換為字符串'true'
console.info(''+false);//false
具體的轉(zhuǎn)換規(guī)則如下:
數(shù)據(jù)類型 | 轉(zhuǎn)換為true的值 | 轉(zhuǎn)換為false的值 |
Undefined | - | undefined |
Null | - | null |
Boolean | true | false |
Number | 任意非0數(shù)值(包括無(wú)窮大) | 0和NaN |
String | 任意非空字符串 | 空字符串 |
Object | 任意對(duì)象 | - |
4、Number類型
在ECMAScript中,沒(méi)有單獨(dú)的整型、浮點(diǎn)型,只有一個(gè)Number類型,使用IEEE754格式來(lái)表示(這種表示法在計(jì)算時(shí)會(huì)有舍入誤差),在這里不去細(xì)究底層實(shí)現(xiàn),這些東西在學(xué)校學(xué)C語(yǔ)言的時(shí)候已經(jīng)很頭痛了,不想再頭痛一次。下面我把實(shí)際編程中用的最多的放到最前面來(lái)講,這一般來(lái)說(shuō)已經(jīng)足夠,對(duì)于不想被太邊緣的細(xì)節(jié)所困擾的朋友,隨時(shí)可以跳過(guò)后面關(guān)于Number的論述。
(1)數(shù)值轉(zhuǎn)換:主要是下面的三個(gè)轉(zhuǎn)換函數(shù)
- Number()函數(shù):和Boolean()類似,將數(shù)據(jù)轉(zhuǎn)換成Number類型,和使用一元加操作符(+)作用相同,建議使用 + 操作符,比較簡(jiǎn)單。
- parseInt()函數(shù):解析整數(shù),可以傳入數(shù)據(jù)和進(jìn)制,如parseInt('070',8)輸出10進(jìn)制的56。
- parseFloat()函數(shù):解析浮點(diǎn)數(shù),只能接受一個(gè)參數(shù),需要注意的是,如果被解析的數(shù)據(jù)結(jié)果是整數(shù),會(huì)直接返回整數(shù)。
注:使用Number()和+轉(zhuǎn)換時(shí),true—>1,false—>0,undefined—>NaN,null—>0,空字符串—>0,非空字符串—>按數(shù)值解析。
var trueVal = true;
var falseVal = false;
var undef = undefined;
var nullVal = null;
var intVal = '1';
var floatVal = '1.0';
var strVal = 'test';
var empty = '';
console.info(Number(trueVal));//1
console.info(Number(falseVal));//0
console.info(Number(undef));//NaN
console.info(Number(nullVal));//0
console.info(Number(intVal));//1
console.info(Number(floatVal));//1
console.info(Number(strVal));//NaN
console.info(Number(empty));//0
console.info(+trueVal);//1
console.info(+falseVal);//0
console.info(+undef);//NaN
console.info(+nullVal);//0
console.info(+intVal);//1
console.info(+floatVal);//1
console.info(+strVal);//NaN
console.info(+empty);//0
console.info(parseInt(trueVal));//NaN
console.info(parseInt(falseVal));//NaN
console.info(parseInt(undef));//NaN
console.info(parseInt(nullVal));//NaN
console.info(parseInt(intVal));//1
console.info(parseInt(floatVal));//1
console.info(parseInt(strVal));//NaN
console.info(parseInt(empty));//NaN
console.info(parseFloat(trueVal));//NaN
console.info(parseFloat(falseVal));//NaN
console.info(parseFloat(undef));//NaN
console.info(parseFloat(nullVal));//NaN
console.info(parseFloat(intVal));//1
console.info(parseFloat(floatVal));//1
console.info(parseFloat(strVal));//NaN
console.info(parseFloat(empty));//NaN
說(shuō)明:這些轉(zhuǎn)換函數(shù)的行為可能會(huì)由于瀏覽器的不同實(shí)現(xiàn)而不同,建議在實(shí)際編程過(guò)程中對(duì)存有疑問(wèn)的先自行編寫測(cè)試。在《JavaScript高級(jí)程序設(shè)計(jì)(第3版)》中,這一節(jié)描述的也有很多地方和我實(shí)際運(yùn)行的結(jié)果不同,比如原書說(shuō)parseInt()只能解析字符串,但是下面的代碼也可以運(yùn)行:
var object = {
value:1,
toString:function(){
return this.value;
}
};
console.info(parseInt(object));//1
(2)整數(shù)和浮點(diǎn)數(shù):受C語(yǔ)言熏陶的人,肯定要固執(zhí)的區(qū)分一下整數(shù)和浮點(diǎn)數(shù)吧!在ECMAScript中,他們沒(méi)有預(yù)想的那么有差別,簡(jiǎn)單點(diǎn),含有小數(shù)點(diǎn)且小數(shù)點(diǎn)后至少有一位不是0的數(shù)值就是浮點(diǎn)數(shù),否則就是整數(shù),比如1.01是浮點(diǎn)數(shù),1.、1.00因?yàn)樾?shù)點(diǎn)后沒(méi)有不是0的數(shù),引擎會(huì)解析成整數(shù)1。你可能會(huì)設(shè)想兩個(gè)整數(shù)相除結(jié)果也會(huì)取整吧,比如3 / 2 = 1,但是在ECMAScript中,不要擔(dān)心這些,已經(jīng)還原其數(shù)學(xué)屬性了,你會(huì)發(fā)現(xiàn) 3 / 2 = 1.5了,這一點(diǎn),在運(yùn)算符相關(guān)部分還會(huì)再提及。
(3)進(jìn)制:也稱進(jìn)位制,實(shí)際上就是進(jìn)位(低位向高位)的方法,每種進(jìn)制都有一個(gè)基數(shù),當(dāng)?shù)臀粩?shù)值達(dá)到這個(gè)基數(shù)時(shí),就向高位進(jìn)1。在日常生活中,用的最多的自然是10進(jìn)制,比如10角就進(jìn)位為1元,在時(shí)間度量中,還有24進(jìn)制(24小時(shí)為1天)、60進(jìn)制(60秒為1分),在古代,也有使用16進(jìn)制的(想一想半斤八兩吧)。但是在計(jì)算機(jī)的處理中,由于電流只有通和不通兩種狀態(tài),所以只能處理2進(jìn)制數(shù)據(jù),不過(guò)這對(duì)于自然人來(lái)說(shuō)不好理解,于是又使用8進(jìn)制、16進(jìn)制作為10進(jìn)制和2進(jìn)制轉(zhuǎn)換的中間狀態(tài)。
在ES3中,可以使用8進(jìn)制、10進(jìn)制、16進(jìn)制,但是在ES5中,8進(jìn)制已經(jīng)被禁用了。
8進(jìn)制:以1位數(shù)字0開始,后面是8進(jìn)制數(shù)字序列(0~7),如果數(shù)字超過(guò)了7,會(huì)忽略前導(dǎo)0而作為10進(jìn)制處理,比如08會(huì)解析為10進(jìn)制的數(shù)字8。
16進(jìn)制:以1位數(shù)字0和1個(gè)字母x開始,后面是16進(jìn)制數(shù)字序列(0-9a-fA-F)。
10進(jìn)制:可以直接將所有數(shù)位一一寫出來(lái),也可以使用科學(xué)計(jì)數(shù)法(不明白?找一本中學(xué)數(shù)學(xué)教科書來(lái)看看吧)來(lái)表示。
(3)特殊值:在ECMAScript中,有2個(gè)特殊的數(shù)值NaN和Infinity需要注意一下,前者表示不是一個(gè)數(shù)值(Not a Number),后者表示不在表示范圍內(nèi)的數(shù)值,還可以使用正負(fù)號(hào)表示方向。對(duì)于這兩個(gè)特殊值,這里不去考察具體的運(yùn)算規(guī)則(你若感興趣,可以自行測(cè)試,我在下面也會(huì)舉一些例子),只做如下兩點(diǎn)說(shuō)明:
A、不能用val==NaN來(lái)判斷一個(gè)變量是否為NaN,而要使用全局的isNaN()函數(shù),該函數(shù)接受一個(gè)參數(shù),當(dāng)參數(shù)可以轉(zhuǎn)換為數(shù)值時(shí)返回true,否則返回false。
B、盡量不要使用val==Infinity判斷是否超出范圍,而使用全局的isFinite()函數(shù),該函數(shù)接受一個(gè)參數(shù),當(dāng)參數(shù)數(shù)值處于表示范圍內(nèi)時(shí)返回true,否則返回false。這里所說(shuō)的表示范圍是指從Number.MIN_VALUE到Number.MAX_VALUE,另外,在Number里面,還有屬性Number.NEGATIVE_INFINITY和Number.POSITIVE_INFINITY,其值分別為Infinity和 -Infinity。
console.info(0/0); //NaN
console.info(NaN==NaN);//false
console.info(NaN+1);//NaN
console.info(NaN/NaN);//NaN
var notNumber = NaN;
console.info(notNumber==NaN);//false
console.info(isNaN(notNumber));//true
console.info(1/0); //Infinity
console.info(-1/0); //-Infinity
console.info(1/Infinity);//0
console.info(Infinity/Infinity);//NaN
console.info(Infinity==Infinity); //true
var inf = Infinity;
console.info(inf==Infinity);//true
console.info(!isFinite(inf));//true
console.info(!isFinite(NaN));//true
console.info(isNaN(Infinity));//false
注:在《JavaScript高級(jí)程序設(shè)計(jì)(第3版)》中第29頁(yè)說(shuō)任何數(shù)值除以0都會(huì)返回NaN,實(shí)際上并非如此。
5、String類型
和一般類C語(yǔ)言不同,在ECMAScript中,沒(méi)有字符類型,而將字符串類型String作為一種簡(jiǎn)單類型,其字面量使用引號(hào)(單引號(hào)'或雙引號(hào)“)括起來(lái)。
(1)對(duì)于字符串類型的操作,加號(hào)“+”被重載,任意一個(gè)數(shù)值與字符串相加,都會(huì)先將其使用String()轉(zhuǎn)換成字符串,然后將兩個(gè)字符串合并。
(2)使用String()轉(zhuǎn)換,undefined—>'undefined',null—>'null',true—>'true',false—>'false',數(shù)值類型Number—>按數(shù)值可見的字符轉(zhuǎn)換,對(duì)象Object—>調(diào)用toString。
console.info(''+1+1);//11,而不是2
console.info(''+true);//true
console.info(''+undefined);//undefined
console.info(''+null);//null
(3)字符串使用反斜杠“\”來(lái)轉(zhuǎn)義,常見的一些轉(zhuǎn)義字符有:
字面量 | 含義 | 字面量 | 含義 |
\n | 換行 | \\ | 反斜杠 |
\t | 制表 | \' | 單引號(hào) |
\b | 空格 | \" | 雙引號(hào) |
\r | 回車 | \xnn | 以十六進(jìn)制代碼nn表示的一個(gè)字符 |
\f | 進(jìn)紙 | \unnnn | 以十六進(jìn)制代碼nnnn表示的一個(gè)Unicode字符 |
好了,關(guān)于簡(jiǎn)單數(shù)據(jù)類型,就整理到此。
- JavaScript高級(jí)程序設(shè)計(jì) DOM學(xué)習(xí)筆記
- JavaScript高級(jí)程序設(shè)計(jì) XML、Ajax 學(xué)習(xí)筆記
- JavaScript高級(jí)程序設(shè)計(jì) 事件學(xué)習(xí)筆記
- JavaScript高級(jí)程序設(shè)計(jì)(第3版)學(xué)習(xí)筆記 概述
- JavaScript高級(jí)程序設(shè)計(jì)(第3版)學(xué)習(xí)筆記2 js基礎(chǔ)語(yǔ)法
- JavaScript高級(jí)程序設(shè)計(jì)(第三版)學(xué)習(xí)筆記6、7章
相關(guān)文章
JavaScript中document.referrer的用法詳解
這篇文章主要給大家介紹了關(guān)于JavaScript中document.referrer的用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-07-07談?wù)勱P(guān)于JavaScript 中的 MVC 模式
本文介紹了模型-視圖-控制器模式在 JavaScript 中的實(shí)現(xiàn),有需要的朋友可以參考一下2013-04-04JS之if語(yǔ)句對(duì)接事件動(dòng)作邏輯(詳解)
下面小編就為大家?guī)?lái)一篇JS之if語(yǔ)句對(duì)接事件動(dòng)作邏輯(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06