JavaScript數(shù)據(jù)類型

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ì)將會單獨寫出。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容