ECMAScript中有5中簡單的數(shù)據(jù)類型(也稱為基本數(shù)據(jù)類型):Undefined、Boolean、Null、String和Number。還有一種復(fù)雜數(shù)據(jù)類型——Object。
typeof操作符
typeof用來檢測給定變量的數(shù)據(jù)類型。typeof通常會返回以下字符串:
- “Undefined“——如果這個值未定義;
- “boolean”——如果這個值是布爾值;
- “string”——如果這個值是字符串;
- “number”——如果這個值是數(shù)值;
- “object”——如果這個值是對象或null;
- “function”——如果這個值是函數(shù)。
typeof不是函數(shù),typeof返回值是字符串類型。
Undefined類型
當(dāng)聲明一個變量,未對變量進(jìn)行初始化時,使用typeof操作符時,返回值為undefined。
var a;
console.log(typeof(a)); //undefined
var a = undefined;
console.log(a == undefined); //true
console.log(b); //ReferenceError
console.log(typeof(a)); //undefined
console.log(typeof(b)); //undefined
Null類型
null表示一個空對象指針,這也是使用typeof操作符檢測null值時,會返回“Object”的原因。
var a = null;
console.log(typeof(a)); //object
如果要創(chuàng)建一個空對象時,最好將對象賦值為null,這樣在以后使用時,只需要檢測null值就可以知道變量是否已經(jīng)保存了對象的引用。
var person = null;
if (car != null) {
// 對person對象進(jìn)行操作
}
undefined值是派生自null值得,因此ECMA-262規(guī)定對它們的想等性測試返回true
console.log(null == undefined); //true
建議:聲明空變量時,不用將其賦值為undefined,即undefined一般不顯示使用;聲明空對象時,應(yīng)將其賦值為null,這體現(xiàn)了null表示一個空對象指針。
Boolean類型
Boolean類型有兩個值,即true和false,并且Boolean類型區(qū)分大小寫,因此不能將true寫成True,不能講false寫成False。
Boolean字面值只有兩個,但ECMAScript中所有類型的值都有與這兩個Boolean值等價的值。將一個值轉(zhuǎn)換為Boolean類型,只需要調(diào)用Boolean()函數(shù)即可。
var message = "hello world";
var messageAsBoolean = Boolean(message);
console.log(`${messageAsBoolean} : ${typeof messageAsBoolean}`) //true : boolean
| 數(shù)據(jù)類型 | true | false |
|---|---|---|
| Boolean | true | false |
| String | 任何字符串 | “ ”(空字符串) |
| Number | 任何非零數(shù)(包括無窮大) | 0和NaN |
| Object | 任何對象 | null |
| Undefined | 不適用 | undefined |
因為存在任何類型可以轉(zhuǎn)換為Boolean類型,所以對理解流程控制語句自動執(zhí)行響應(yīng)Boolean轉(zhuǎn)換非常重要。
var message = "hello world";
if (message) {
console.log(message);
}
Number類型
在進(jìn)行算術(shù)計算時,所有以八進(jìn)制和十六進(jìn)制表示的數(shù)值都將轉(zhuǎn)換成十進(jìn)制。浮點數(shù)需要的空間是整數(shù)需要空間的兩倍,因此ECMAScript會盡可能的將其保存為整數(shù)類型。使用Number類型時,對于較大的數(shù)字可以采用科學(xué)技術(shù)法,如31250000可以表示為3.125e7。
由于內(nèi)存的限制,ECMAScript保存的數(shù)值是有大小的,最大值保存在Number.MAX_VALUE中,最小值保存在MIN_VALUE中。如果超過了這兩個范圍就會將其轉(zhuǎn)換為infinity(無窮大)。使用isFinite()函數(shù)可以判斷一個數(shù)是否在有效的范圍內(nèi),如果不在有效的范圍內(nèi),將不能繼續(xù)執(zhí)行運算。
NaN數(shù)據(jù)類型
NaN,即非數(shù)值(Not a Number)是一個特殊的數(shù)值,用于表示一個本來要返回數(shù)值的操作數(shù)未返回數(shù)值的情況。NaN有兩個非同尋常的特點:==任何涉及NaN的操作都會返回NaN;NaN與任何值都不相等,也包括本身==。
console.log(NaN == NaN) //false
可以使用isNaN()函數(shù)來判斷一個數(shù)是否是NaN類型,isNaN()函數(shù)接收一個值時,會嘗試將這個值轉(zhuǎn)換為一個數(shù)。
console.log(isNaN(NaN)); //true
console.log(isNaN(10)); //false
console.log(isNaN("10")); //false
console.log(isNaN("blue")); //true
console.log(isNaN(true)); //false
isNaN()也可以用于對象,對象調(diào)用isNaN()時,會首先調(diào)用valueOf()方法,然后確定該方法返回值是否可以轉(zhuǎn)換為數(shù)值。如果不能基于這個值調(diào)用toString()方法,在測試返回值。
數(shù)值轉(zhuǎn)換
Number()、parseInt()和parseFloat()可以將非數(shù)值轉(zhuǎn)換為數(shù)值類型。
Number()函數(shù)的轉(zhuǎn)換規(guī)則:
- 如果是Boolean值,true轉(zhuǎn)為1,false轉(zhuǎn)為0;
- 如果是null,返回0;
- 如果是undefiend值,返回NaN;
- 如果是字符串
- 如果字符串中包含數(shù)字就轉(zhuǎn)換為十進(jìn)制數(shù)值,且把前面的0去了。如“123”轉(zhuǎn)為123,“011”轉(zhuǎn)為11;
- 十六進(jìn)制會轉(zhuǎn)為十進(jìn)制;
- 空字符串轉(zhuǎn)為0;
- 如果是其他字符串時,將其轉(zhuǎn)為NaN;
- 如果是對象,則調(diào)用valueOf()方法,然后依照前面的規(guī)則轉(zhuǎn)換返回的值。如果轉(zhuǎn)換的結(jié)果是NaN,則調(diào)用toString()方法,然后依次按照前面的規(guī)則進(jìn)行轉(zhuǎn)換。
var num = Number("hello world"); //NaN
一元加操作與Number()函數(shù)相同。
parseInt()函數(shù)的轉(zhuǎn)換規(guī)則:
- 如果第一個字符串不是數(shù)字字符或者符號,返回NaN;
var num1 = parseInt("1234blue"); //1234
var num2 = parseInt("") //NaN
var num3 = parseInt("0xA"); //10
var num4 = parseInt("22.5"); //22
var num5 = parseInt("070"); //56
var num6 = parseInt("70"); //70
var num7 = parseInt("0xf"); //15
parseInt()函數(shù)會接受第二個參數(shù),指定轉(zhuǎn)換時使用的基數(shù)。
parseFloat()同parseInt(),唯一不同是,parseFloat()會忽略前導(dǎo)的0,==parseFloat只解析十進(jìn)制==。
var num1 = parseFloat("1234blue"); //1234
var num2 = parseFloat("0xA"); //0
var num3 = parseFloat("22.5"); //22.5
var num4 = parseFloat("22.34.5"); //22.34
var num5 = parseFloat("0908.5"); //908.5
var num6 = parseFloat("3.125e7"); //31250000
String類型
String字符串一旦創(chuàng)建就不可以改變,除非先銷毀原字符串在重新進(jìn)行賦值。
轉(zhuǎn)換為String類型
使用幾乎每個值都有的toString()方法。除了null和undefined沒有toString()方法外,數(shù)值、布爾值、字符串和對象都有toString()方法。
var age = 11;
var ageAsStr = age.toString(); //"11"
var found = true;
var foundAsStr = found.toString(); //"true"
在調(diào)用數(shù)值的toString()方法時,可以傳遞一個參數(shù):輸出數(shù)值的基數(shù)。默認(rèn)情況,toString()以十進(jìn)制格式返回數(shù)值的字符串表示。
var num = 10;
console.log(num.toString()) //"10"
console.log(num.toString(2)) //"1010"
console.log(num.toString(8)) //"12"
console.log(num.toString(10)) //"10"
console.log(num.toString(16)) //"a"
在不知道要轉(zhuǎn)換的值是不是null或undefined的情況下,還可以使用轉(zhuǎn)型函數(shù)String(),這個函數(shù)能夠?qū)⑷魏晤愋偷闹缔D(zhuǎn)換為字符串。使用String()方法時,如果要轉(zhuǎn)換的值有toString()方法,則調(diào)用這個方法,如果是null則返回“null”,如果是undefined則返回“undefined”。
var value1 = 10;
var value2 = true;
var value3 = null;
var value4;
console.log(String(value1)); //"10"
console.log(String(value2)); //"true"
console.log(String(value3)); //"null"
console.log(String(value4)); //undefined
要把某個值轉(zhuǎn)換為字符串,可以使用加號操作符把它與一個“”(空字符)加在一起。
Object類型
瀏覽器環(huán)境中的對象,比如,BOM和DOM中的對象,都屬于宿主對象,它們是由宿主實現(xiàn)提供和定義的。
對象詳細(xì)將會單獨寫出。