欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript高級程序設(shè)計(第3版)學(xué)習(xí)筆記3 js簡單數(shù)據(jù)類型

 更新時間:2012年10月11日 02:22:29   作者:  
數(shù)據(jù)類型是編程語言的磚瓦,是所有你能想象到的復(fù)雜抽象的基礎(chǔ),在現(xiàn)代編程語言中,除了語言本身內(nèi)置的一些簡單數(shù)據(jù)類型外,基本上都提供了用于自定義數(shù)據(jù)類型的語言機制(在C中也可以利用結(jié)構(gòu)體來實現(xiàn)),這些機制在一定程度上也決定了該語言的流行度和生命力
ECMAScript是一種動態(tài)類型的語言,構(gòu)建于5種簡單數(shù)據(jù)類型(Undefined、Null、Boolean、Number、String)和一種復(fù)雜數(shù)據(jù)類型(Object)的基礎(chǔ)之上。這篇文章就來復(fù)習(xí)一下簡單數(shù)據(jù)類型,我會盡量從編程實踐的角度來描述,下面代碼運行環(huán)境為FireFox 14.0.1。

簡單數(shù)據(jù)類型

簡單數(shù)據(jù)類型 取值
Undefined undefined(只有一個值)
Null null(只有一個值)
Boolean true|false(只有兩個值)
Number 數(shù)值
String 字符串

  首先需要說明的是,在ECMAScript中,上述5種簡單數(shù)據(jù)類型,其中Boolean、Number、String都有同名的內(nèi)置包裝對象,而簡單數(shù)據(jù)類型的字面值(變量)會根據(jù)情況自動包箱,從而可以直接調(diào)用方法,至于具體可以調(diào)用哪些方法,在討論內(nèi)置對象時再詳細說明:

復(fù)制代碼 代碼如下:

console.info(true.toString());//true,相當于使用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,相當于使用Boolean()包裝之后再調(diào)用
console.info('test'.toString());//test,相當于使用String()包裝之后再調(diào)用

try{
console.info(undefined.toString());//沒有相應(yīng)包裝類型,拋出異常
}catch(e){
console.info(e);//TypeError
}
try{
console.info(null.toString());//沒有相應(yīng)包裝類型,拋出異常
}catch(e){
console.info(e);//TypeError
}

var num = 4;
console.info(num.toString());//4,可以直接在簡單數(shù)值變量上調(diào)用方法,相當于使用Number()包裝之后再調(diào)用
//console.info(3.toString());//SyntaxError,語法錯誤不能使用try捕獲,說明不能直接在數(shù)值字面量上調(diào)用

其次說一下實際用的最多的數(shù)據(jù)轉(zhuǎn)換:
  (1)轉(zhuǎn)換為Boolean:!!value
 ?。?)轉(zhuǎn)換為Number:+value
 ?。?)轉(zhuǎn)換為String:''+value
  下面再具體說明5種簡單數(shù)據(jù)類型:
1、Undefined類型
  Undefined數(shù)據(jù)類型只有一個取值:undefined。
(1)所有未初始化的值都默認為undefined(也就沒有必要把一個變量顯示初始化為undefined了)。
(2)在函數(shù)作用域中,沒有傳入實際參數(shù)的函數(shù)形參為undefined。
(3)函數(shù)沒有明確返回或者return;的時候,返回值為undefined。
(4)在ECMAScript中,規(guī)定null==undefined返回true,而null===undefined返回false。
(5)undefined相應(yīng)的Boolean值為false。
(6)使用typeof作用于undefiend時,返回字符串'undefined',作用于一個從未聲明的“變量”時,也會返回'undefined'。
(7)undefined轉(zhuǎn)換數(shù)值為NaN,轉(zhuǎn)換字符串為'undefined'。
復(fù)制代碼 代碼如下:

console.info(undefined===undefined);//true
console.info(typeof undefined);//undefined
console.info(typeof noDefined);//undefined,未定義的標識符,使用typeof也返回undefined,這也是未定義的標識符唯一可用的的操作符
console.info(!undefined);//true,這里返回true,正是很多條件語句中判斷變量是否初始化的基礎(chǔ)
console.info(!!undefined);//任何一個值,使用雙重否定!!都會將其轉(zhuǎn)換為相應(yīng)的Boolean值,這里說明undefiend相應(yīng)的Boolean值為false
console.info(undefined==null);//ES中規(guī)定,null與undefined相等性測試返回true
console.info(undefined===null);//但undefined與null畢竟是兩個數(shù)據(jù)類型,使用全等比較時,返回false
console.info(typeof undefined==undefined);//false,typeof undefined返回的是一個字符串'undefined',所以這里輸出false
console.info(+undefined);//NaN,轉(zhuǎn)換數(shù)值時為NaN
console.info(''+undefined);//undefined,轉(zhuǎn)換為字符串'undefined'

2、Null類型
  Null類型也只有一個值:null。
(1)對null值使用typeof時,返回字符串'object'。
(2)null相應(yīng)的Boolean值為false。
(3)如果一個變量用于保存一個對象,建議初始化為null。
(4)null轉(zhuǎn)換數(shù)值為0,轉(zhuǎn)換字符串為'null'。
復(fù)制代碼 代碼如下:

console.info(null===null);//true
console.info(typeof null);//object
console.info(!null);//true
console.info(!!null);//false,說明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類型只有兩個值:true和false。
(1)雖然只有兩個值,但是任何一種數(shù)據(jù)類型的值都能轉(zhuǎn)換為與其相對應(yīng)的Boolean值,轉(zhuǎn)換方式主要有三種:
  A、通過轉(zhuǎn)型函數(shù)Boolean()轉(zhuǎn)換
    需要注意的是,當Boolean()作為轉(zhuǎn)換函數(shù)時,會轉(zhuǎn)換為一個與其相應(yīng)的Boolean值,當作為構(gòu)造函數(shù)時,會創(chuàng)建一個對象,而任意非空對象的Boolean值都是true,有時候這會造成誤解,建議就是不使用Boolean()。對于String()、Number()也有類似情況。
  B、通過雙重否定!!操作符轉(zhuǎn)換
  C、通過隱式轉(zhuǎn)換,比如一些條件語句中
(2)Boolean類型的true和false,使用typeof時,均返回字符串'boolean'。
(3)在轉(zhuǎn)換為數(shù)值時,true和false分別轉(zhuǎn)換為1和0,轉(zhuǎn)換為字符串時,分別為'true'和'false'。
復(fù)制代碼 代碼如下:

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,說明兩種轉(zhuǎn)換方式等價
console.info(!!empty === Boolean(empty));//true
console.info(new Boolean(value));//Boolean對象,注意這里使用了new,會創(chuàng)建一個對象
console.info(new Boolean(empty));//Boolean對象
if(value){//隱式轉(zhuǎn)換為true
console.info(value);//test
}
if(empty){//隱式轉(zhuǎn)換為false,不執(zhí)行括號內(nèi)部語句
console.info('empty');
}
if(new Boolean(empty)){//先創(chuàng)建對象,再隱式轉(zhuǎn)換為true,會執(zhí)行括號內(nèi)部的語句
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ù)值(包括無窮大) 0和NaN
String 任意非空字符串 空字符串
Object 任意對象 -

 4、Number類型

  在ECMAScript中,沒有單獨的整型、浮點型,只有一個Number類型,使用IEEE754格式來表示(這種表示法在計算時會有舍入誤差),在這里不去細究底層實現(xiàn),這些東西在學(xué)校學(xué)C語言的時候已經(jīng)很頭痛了,不想再頭痛一次。下面我把實際編程中用的最多的放到最前面來講,這一般來說已經(jīng)足夠,對于不想被太邊緣的細節(jié)所困擾的朋友,隨時可以跳過后面關(guān)于Number的論述。

(1)數(shù)值轉(zhuǎn)換:主要是下面的三個轉(zhuǎn)換函數(shù)

  • Number()函數(shù):和Boolean()類似,將數(shù)據(jù)轉(zhuǎn)換成Number類型,和使用一元加操作符(+)作用相同,建議使用 + 操作符,比較簡單。
  • parseInt()函數(shù):解析整數(shù),可以傳入數(shù)據(jù)和進制,如parseInt('070',8)輸出10進制的56。
  • parseFloat()函數(shù):解析浮點數(shù),只能接受一個參數(shù),需要注意的是,如果被解析的數(shù)據(jù)結(jié)果是整數(shù),會直接返回整數(shù)。

注:使用Number()和+轉(zhuǎn)換時,true—>1,false—>0,undefined—>NaN,null—>0,空字符串—>0,非空字符串—>按數(shù)值解析。

復(fù)制代碼 代碼如下:

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

說明:這些轉(zhuǎn)換函數(shù)的行為可能會由于瀏覽器的不同實現(xiàn)而不同,建議在實際編程過程中對存有疑問的先自行編寫測試。在《JavaScript高級程序設(shè)計(第3版)》中,這一節(jié)描述的也有很多地方和我實際運行的結(jié)果不同,比如原書說parseInt()只能解析字符串,但是下面的代碼也可以運行:
復(fù)制代碼 代碼如下:

var object = {
value:1,
toString:function(){
return this.value;
}
};
console.info(parseInt(object));//1

(2)整數(shù)和浮點數(shù):受C語言熏陶的人,肯定要固執(zhí)的區(qū)分一下整數(shù)和浮點數(shù)吧!在ECMAScript中,他們沒有預(yù)想的那么有差別,簡單點,含有小數(shù)點且小數(shù)點后至少有一位不是0的數(shù)值就是浮點數(shù),否則就是整數(shù),比如1.01是浮點數(shù),1.、1.00因為小數(shù)點后沒有不是0的數(shù),引擎會解析成整數(shù)1。你可能會設(shè)想兩個整數(shù)相除結(jié)果也會取整吧,比如3 / 2 = 1,但是在ECMAScript中,不要擔心這些,已經(jīng)還原其數(shù)學(xué)屬性了,你會發(fā)現(xiàn) 3 / 2 = 1.5了,這一點,在運算符相關(guān)部分還會再提及。

(3)進制:也稱進位制,實際上就是進位(低位向高位)的方法,每種進制都有一個基數(shù),當?shù)臀粩?shù)值達到這個基數(shù)時,就向高位進1。在日常生活中,用的最多的自然是10進制,比如10角就進位為1元,在時間度量中,還有24進制(24小時為1天)、60進制(60秒為1分),在古代,也有使用16進制的(想一想半斤八兩吧)。但是在計算機的處理中,由于電流只有通和不通兩種狀態(tài),所以只能處理2進制數(shù)據(jù),不過這對于自然人來說不好理解,于是又使用8進制、16進制作為10進制和2進制轉(zhuǎn)換的中間狀態(tài)。

  在ES3中,可以使用8進制、10進制、16進制,但是在ES5中,8進制已經(jīng)被禁用了。

  8進制:以1位數(shù)字0開始,后面是8進制數(shù)字序列(0~7),如果數(shù)字超過了7,會忽略前導(dǎo)0而作為10進制處理,比如08會解析為10進制的數(shù)字8。

  16進制:以1位數(shù)字0和1個字母x開始,后面是16進制數(shù)字序列(0-9a-fA-F)。

  10進制:可以直接將所有數(shù)位一一寫出來,也可以使用科學(xué)計數(shù)法(不明白?找一本中學(xué)數(shù)學(xué)教科書來看看吧)來表示。

(3)特殊值:在ECMAScript中,有2個特殊的數(shù)值NaN和Infinity需要注意一下,前者表示不是一個數(shù)值(Not a Number),后者表示不在表示范圍內(nèi)的數(shù)值,還可以使用正負號表示方向。對于這兩個特殊值,這里不去考察具體的運算規(guī)則(你若感興趣,可以自行測試,我在下面也會舉一些例子),只做如下兩點說明:

  A、不能用val==NaN來判斷一個變量是否為NaN,而要使用全局的isNaN()函數(shù),該函數(shù)接受一個參數(shù),當參數(shù)可以轉(zhuǎn)換為數(shù)值時返回true,否則返回false。

  B、盡量不要使用val==Infinity判斷是否超出范圍,而使用全局的isFinite()函數(shù),該函數(shù)接受一個參數(shù),當參數(shù)數(shù)值處于表示范圍內(nèi)時返回true,否則返回false。這里所說的表示范圍是指從Number.MIN_VALUE到Number.MAX_VALUE,另外,在Number里面,還有屬性Number.NEGATIVE_INFINITY和Number.POSITIVE_INFINITY,其值分別為Infinity和 -Infinity。
復(fù)制代碼 代碼如下:

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高級程序設(shè)計(第3版)》中第29頁說任何數(shù)值除以0都會返回NaN,實際上并非如此。

5、String類型

  和一般類C語言不同,在ECMAScript中,沒有字符類型,而將字符串類型String作為一種簡單類型,其字面量使用引號(單引號'或雙引號“)括起來。

(1)對于字符串類型的操作,加號“+”被重載,任意一個數(shù)值與字符串相加,都會先將其使用String()轉(zhuǎn)換成字符串,然后將兩個字符串合并。

(2)使用String()轉(zhuǎn)換,undefined—>'undefined',null—>'null',true—>'true',false—>'false',數(shù)值類型Number—>按數(shù)值可見的字符轉(zhuǎn)換,對象Object—>調(diào)用toString。
復(fù)制代碼 代碼如下:

console.info(''+1+1);//11,而不是2
console.info(''+true);//true
console.info(''+undefined);//undefined
console.info(''+null);//null

(3)字符串使用反斜杠“\”來轉(zhuǎn)義,常見的一些轉(zhuǎn)義字符有:

字面量 含義 字面量 含義
\n 換行 \\ 反斜杠
\t 制表 \' 單引號
\b 空格 \" 雙引號
\r 回車 \xnn 以十六進制代碼nn表示的一個字符
\f 進紙 \unnnn 以十六進制代碼nnnn表示的一個Unicode字符

好了,關(guān)于簡單數(shù)據(jù)類型,就整理到此。

相關(guān)文章

最新評論