大家好,我是IT修真院萌新分院的王寒,一枚正直,純潔,善良的前端程序員。
今天給大家分享一下基本數(shù)據(jù)類型。
1.背景介紹
JavaScript是一種弱類型或者說動態(tài)語言。就是不用提前聲明變量的類型, 在程序運行過程中,類型會被自動確定。這也意味著你可以使用同一個變量保存不同類型的數(shù)據(jù)
2.知識剖析
js基本數(shù)據(jù)類型有哪些?
ECMAScript中有5中簡單數(shù)據(jù)類型(也稱為基本數(shù)據(jù)類型): Undefined、Null、Boolean、Number和String。 還有1中復雜的數(shù)據(jù)類型————Object,Object本質(zhì)上是由一組無序的名值對組成的。
typeof 操作符
由于js中的變量是松散類型的,所以它提供了一種檢測當前變量的數(shù)據(jù)類型的方法,就是typeof關(guān)鍵字. 通過typeof關(guān)鍵字,對這5種數(shù)據(jù)類型會返回下面的值(以字符串形式顯示)
undefined ---------- 如果值未定義 Undefined
boolean ---------- 如果這個值是布爾值 Boolean
string ---------- 如果這個值是字符串 String
number ---------- 如果這個值是數(shù)值類型 Number
object ---------- 如果這個值是對象或null Object
需要注意的是typeof null返回為object,因為特殊值null被認為是一個空的對象引用。
1. Undefined
Undefined類型只有一個值,即特殊的undefined。在使用var聲明變量但未對其加以初始化時,這個變量的值就是undefined
var a;
alert(a==undefined);//true
這個例子只聲明了變量a,但并沒有對它進行初始化。比較這個變量與undefined字面量,表明它們是相等的
var a=undefined;
alert(a==undefined);//true
這個例子使用undefined值顯示初始化了變量a,但是沒有必要這么做,因為未經(jīng)初始化的值默認就會取得undefined值
不過包含undefined值的變量與未定義的變量還是不一樣的
var a=;//這個變量聲明之后默認取得了undefined值
//下面這個變量并沒有聲明
//var age
alert(a);? //"undefined"
alert(age);? //產(chǎn)生錯誤
第一個警告框會顯示a的值,即"undefined";第二個警告框因為傳遞alert()函數(shù)的是沒有聲明的變量age所以會出現(xiàn)一個錯誤
對沒有初始化的變量執(zhí)行typeof操作符會返回undefined值,而對沒有聲明的變量執(zhí)行typeof操作符也會返回undefined值
var a=;//這個變量聲明之后默認取得了undefined值
//下面這個變量并沒有聲明
//var age
alert(typeof a);? //"undefined"
alert(typeof age);? //"undefined"
2.null
Null類型是第二個只有一個值的數(shù)據(jù)類型,這個特殊的值是null。從邏輯角度來看,null值表示一個空對象指針, 而這也正是使用typeof操作符檢測null時會返回object的原因。
var car=null;
alert(typeof car);? //"object"
如果定義的變量準備在將來用于保存對象,那么最好將該變量初始化為null而不是其他值。這樣一來, 只要直接檢測null值就可以知道相應的變量是否已經(jīng)保存了一個對象的引用了。
if (car !=null){
//對car對象執(zhí)行某些操作
}
實際上undefined值是派生自null值的,因此ECMA-262規(guī)定對它們的相等性測試要返回true
alert(null==undefined);//true
位于null和undefined之間的相等操作符"=="總是返回true,不過需要注意的是這個操作符醋魚比較的目的會轉(zhuǎn)換其操作數(shù)
只要意在保存對象的變量還沒有真正保存對象,就應該明確的讓該變量保存null值。不僅可以體現(xiàn)null作為空對象指針的慣例還有助于進一步區(qū)分null和undefined
3.Boolean
該類型只有兩個字面值:true和false。這兩個值與數(shù)字值不是一回事,因此true不一定等于1,而false也不一定等于0。
var found=true;
var lost=false;
需要注意的是Boolean類型的字面值true和false是區(qū)分大小寫的
雖然Boolean類型的字面值只有兩個,但JavaScript中所有類型的值都有與這兩個Boolean值等價的值。 要將一個值轉(zhuǎn)換為其對應的Boolean值,可以調(diào)用類型轉(zhuǎn)換函數(shù)Boolean(),
var message="Hello world";
var messageAsBoolean=Boolean(message);
在這個例子中,字符串message被轉(zhuǎn)換成了一個Boolean值,該值被保存在messageAsBoolean變量中。 可以對任何數(shù)據(jù)類型的值調(diào)用Boolean()函數(shù),而且總會返回一個Boolean值。至于返回的這個值是true還是false, 取決于要轉(zhuǎn)換值的數(shù)據(jù)類型及其實際值
數(shù)據(jù)類型轉(zhuǎn)換為true的值轉(zhuǎn)換為false的值
Booleantruefalse
String任何非空字符串..(空字符串)
Number任何非零數(shù)字值(包括無窮大)0和NaN
Object任何對象null
Undefined不適用undefined
這些轉(zhuǎn)換規(guī)則對理解流控制語句(如if語句)自動執(zhí)行相應的Boolean轉(zhuǎn)換非常重要
var message="Hello world";
if (message){
alert("Value is true");
}
運行這個示例,就會顯示一個警告框,因為字符串message被自動轉(zhuǎn)換成了對應的Boolean值(true)。 由于存在這種自動執(zhí)行的Boolean轉(zhuǎn)換,因此確切地知道在流控制語句中使用的是什么變量至關(guān)重要
4.Number
這種類型用來表示整數(shù)和浮點數(shù)值,還有一種特殊的數(shù)值,即NaN(非數(shù)值 Not a Number)。 這個數(shù)值用于表示一個本來要返回數(shù)值的操作數(shù)未返回數(shù)值的情況(這樣就不會拋出錯誤了)。 例如,在其他編程語言中,任何數(shù)值除以0都會導致錯誤,從而停止代碼執(zhí)行。但在JavaScript中, 任何數(shù)值除以0會返回NaN,因此不會影響其他代碼的執(zhí)行。
NaN本身有兩個非同尋常的特點。首先,任何涉及NaN的操作(例如NaN/10)都會返回NaN, 這個特點在多步計算中有可能導致問題。其次,NaN與任何值都不相等,包括NaN本身。
alert(NaN == NaN);? ? //false
5.String
String類型用于表示由零或多個16位Unicode字符組成的字符序列, 即字符串。字符串可以由單引號(')或雙引號(")表示。
String類型的特殊性
string類型有些特殊,因為字符串具有可變的大小,所以顯然它不能被直接存儲在具有固定大小的變量中。 由于效率的原因,我們希望JS只復制對字符串的引用,而不是字符串的內(nèi)容。但是另一方面, 字符串在許多方面都和基本類型的表現(xiàn)相似,而字符串是不可變的這一事實(即沒法改變一個字符串值的內(nèi)容), 因此可以將字符串看成行為與基本類型相似的不可變引用類型
Boolean、Number、String 這三個是Javascript中的基本包裝類型,也就是這三個其實是一個構(gòu)造函數(shù), 他們是Function的實例,是引用類型,這里的String指的是String這個構(gòu)造函數(shù),因為Javascript是松散類型的。
var name = String("jwy");
alert(typeof name);//"object"
var author = "Tom";
alert(typeof name);//"string"
注意,typeof 變量 如果值是"string" 的話,也就是這個變量是字符串,在Javascript中,字符串是基本類型,而在C#或Java中, 字符串是引用類型,但是Javascript中的String是引用類型,因為它是Javascript中定義好的基本包裝類型,在C#中, String跟string其實是一樣的。
6.Object
ECMAScript中的對象其實就是一組數(shù)據(jù)和功能的集合。對象可以通過new操作符后跟要創(chuàng)建的對象類型的名稱來創(chuàng)建。 而創(chuàng)建Object類型的實例并為其添加屬性和方法,就可以創(chuàng)建自定義對象
var o=new Object();
在ECMAScript中Object類型是所有它的實例的基礎(chǔ), 也就是說Object類型所具有的任何屬性和方法也同樣存在于更具體的對象中
3.常見問題
問題一:如何判斷數(shù)據(jù)類型
問題二:常用數(shù)據(jù)轉(zhuǎn)換方法
4.解決方法
一:使用typeof操作符。typeof操作符的操作數(shù)可以是變量也可以是數(shù)值字面量。需要注意的是 調(diào)用typeof null會返回"object",因為null被認為是一個空的對象引用。
二:轉(zhuǎn)數(shù)值:parseInt() 和 parseFloat()。
轉(zhuǎn)字符串: .toString()
強制轉(zhuǎn)換:訪問數(shù)據(jù)內(nèi)部內(nèi)容,并將符合格式的內(nèi)容進行轉(zhuǎn)換
Boolean(value) - 把給定的值轉(zhuǎn)換成 Boolean 型;
Number(value) - 把給定的值轉(zhuǎn)換成數(shù)字(可以是整數(shù)或浮點數(shù));
String(value) - 把給定的值轉(zhuǎn)換成字符串;
5.擴展思考
6.參考文獻
7.更多討論
數(shù)組類型屬于哪種類型?
var a=[];
alert(typeof a) //Object
問題:
1.數(shù)據(jù)類型能不能相互轉(zhuǎn)換
答:可以
2.什么是引用類型
答:引用類型就是對象
3.引用類型和基本類型的區(qū)別
答:請點擊