您好,登錄后才能下訂單哦!
Javascript基本的數(shù)據(jù)類型以及對(duì)象類型有哪些,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
有程序設(shè)計(jì)經(jīng)驗(yàn)的讀者肯定知道,在C或者Java這樣的語言中,數(shù)據(jù)是有類型的,比如用以表示用戶名的屬性是字符串,而一個(gè)雇員的年齡則是一個(gè)數(shù)字,表示UI上的一個(gè)開關(guān)按鈕的數(shù)據(jù)模型則為布爾值等等,對(duì)數(shù)字可能還可以細(xì)分為浮點(diǎn)數(shù),整型數(shù),整型數(shù)又可能分為長(zhǎng)整型和短整型,總而言之,它們都表示語言中的數(shù)據(jù)的值的類型。
Javascript基本數(shù)據(jù)類型有哪些
在JavaScript中,包含三種基本的數(shù)據(jù)類型,字符串(String),數(shù)值(Number),布爾值(boolean),下面是一些簡(jiǎn)單的例子:
var str="Hello,world";//字符串
var i=10;//整型數(shù)
var f=2.3;//浮點(diǎn)數(shù)
var b=true;//布爾值
我們可以分別查看變量的值及變量的類型:
print(str);
print(i);
print(f);
print(b);
print(typeof str);
print(typeof i);
print(typeof f);
print(typeof b);
注意,在此處使用的print()函數(shù)為rhino解釋器的頂層對(duì)象的方法,可以用來打印字符串,通常情況下,在客戶端,程序員多使用alert()進(jìn)行類似的動(dòng)作,alert()是瀏覽器中JavaScript解釋器的頂層對(duì)象(window)的一個(gè)方法。
Hello,world
10
2.3
true
string
number
number
Boolean
在JavaScript中,所有的數(shù)字,不論是整型浮點(diǎn),都屬于“數(shù)字”基本類型。typeof是一個(gè)一元的操作符,在本章的另外一個(gè)小節(jié)會(huì)專門講到。
Javascript對(duì)象類型有哪些
這里提到的對(duì)象不是對(duì)象本身,而是指一種類型,我們?cè)诘谌聲?huì)對(duì)對(duì)象進(jìn)行詳細(xì)的討論,此處的對(duì)象包括,對(duì)象(屬性的集合,即鍵值的散列表),數(shù)組(有序的列表),函數(shù)(包含可執(zhí)行的代碼)。
對(duì)象類型是一種復(fù)合的數(shù)據(jù)類型,其基本元素由基本數(shù)據(jù)類型組成,當(dāng)然不限于基本類型,比如對(duì)象類型中的值可以是其他的對(duì)象類型實(shí)例,我們通過例子來說明:
var str="Hello,world";
var obj=new Object();
obj.str=str;
obj.num=2.3;
var array=new Array("foo","bar","zoo");
var func=function(){
print("I am a function here");
}
可以看到,對(duì)象具有屬性,如obj.str,obj.num,這些屬性的值可以是基本類型,事實(shí)上還可以更復(fù)雜,我們來看看他們的類型:
print(typeof obj);
print(typeof array);
print(typeof func);
//將打印出
object
object
function
讀者可能會(huì)對(duì)print(typeof array)打印出object感到奇怪,事實(shí)上,對(duì)象和數(shù)組的界限并不那么明顯(事實(shí)上它們是屬于同一類型的),但是他們的行為卻非常不同,本書的后續(xù)章節(jié)將兩個(gè)重要的數(shù)據(jù)類型做了分別介紹。
兩者之間的轉(zhuǎn)換
類似與Java中基本數(shù)據(jù)類型的自動(dòng)裝箱拆箱,JavaScript也有類似的動(dòng)作,基本數(shù)據(jù)類型在做一些運(yùn)算時(shí),會(huì)臨時(shí)包裝一個(gè)對(duì)象,做完運(yùn)算后,又自動(dòng)釋放該對(duì)象。我們可以通過幾個(gè)例子來說明:
var str="JavaScript Kernal";
print(str.length);//打印17
str為一個(gè)字符串,通過typeof可知其type為”string”,而:
var str2=new String("JavaScript Kernal");
print(typeof str2);
可知,str2的type為”object”,即這兩者并不相同,那么為什么可以使用str.length來的到str的長(zhǎng)度呢?事實(shí)上,當(dāng)使用str.length時(shí),JavaScript會(huì)自動(dòng)包裝一個(gè)臨時(shí)的String對(duì)象,內(nèi)容為str的內(nèi)容,然后獲取該對(duì)象的length屬性,最后,這個(gè)臨時(shí)的對(duì)象將被釋放。
而將對(duì)象轉(zhuǎn)換為基本類型則是通過這樣的方式:通過調(diào)用對(duì)象的valueOf()方法來取得對(duì)象的值,如果和上下文的類型匹配,則使用該值。如果valueOf取不到值的話,則需要調(diào)用對(duì)象的toString()方法,而如果上下文為數(shù)值型,則又需要將此字符串轉(zhuǎn)換為數(shù)值。
由于JavaScript是弱類型的,所以JavaScript引擎需要根據(jù)上下文來“猜測(cè)”對(duì)象的類型,這就使得JavaScript的效率比編譯型的語言要差一些。
valueOf()的作用是,將一個(gè)對(duì)象的值轉(zhuǎn)換成一種合乎上下文需求的基本類型,toString()則名副其實(shí),可以打印出對(duì)象對(duì)應(yīng)的字符串,當(dāng)然前提是你已經(jīng)“重載”了Object的toString()方法。
事實(shí)上,這種轉(zhuǎn)換規(guī)則會(huì)導(dǎo)致很多的問題,比如,所有的非空對(duì)象,在布爾值環(huán)境下,都會(huì)被轉(zhuǎn)成true,比如:
function convertTest(){
if(new Boolean(false)&&new Object()&&new String("")&&new Array()){
print("convert to boolean")
}
}
convertTest();//convert to Boolean
初學(xué)者容易被JavaScript中的類型轉(zhuǎn)換規(guī)則搞暈掉,很多情況下會(huì)覺得那種寫法看著非常別扭,其實(shí)只需要掌握了規(guī)則,這些古怪的寫法會(huì)大大的提高代碼的性能,我們通過例子來學(xué)習(xí)這些規(guī)則:
var x=3;
var y=x+"2";//=>32
var z=x+2;//=>5
print(y);
print(z);
if(datamodel.item){
//do something...
}else{
datamodel.item=new Item();
}
這種寫法事實(shí)上具有更深層次的含義:
應(yīng)該注意到,datamodel.item是一個(gè)對(duì)象(字符串,數(shù)字等),而if需要一個(gè)boolean型的表達(dá)式,所以這里進(jìn)行了類型轉(zhuǎn)換。在JavaScript中,如果上下文需要boolean型的值,則引擎會(huì)自動(dòng)將對(duì)象轉(zhuǎn)換為boolean類型。轉(zhuǎn)換規(guī)則為,如果該對(duì)象非空,則轉(zhuǎn)換為true,否則為false.因此我們可以采取這種簡(jiǎn)寫的形式。
而在傳統(tǒng)的編程語言(強(qiáng)類型)中,我們則需要:
if(datamodel.item!=null){
//do something...
}else{
datamodel.item=new Item();
}
數(shù)據(jù)類型的判斷
前面講到JavaScript特性的時(shí)候,我們說過,JavaScript是一個(gè)弱類型的語言,但是有時(shí)我們需要知道變量在運(yùn)行時(shí)的類型,比如,一個(gè)函數(shù)的參數(shù)預(yù)期為另一個(gè)函數(shù):
function handleMessage(message,handle){
return handle(message);
}
當(dāng)調(diào)用handleMessage的函數(shù)傳遞的handle不是一個(gè)函數(shù)則JavaScript引擎會(huì)報(bào)錯(cuò),因此我們有必要在調(diào)用之前進(jìn)行判斷:
function handleMessage(message,handle){
if(typeof handle=="function"){
return handle(message);
}else{
throw new Error("the 2nd argument should be a function");
}
}
但是,typeof并不總是有效的,比如下面這種情況:
var obj={};
var array=["one","two","three","four"];
print(typeof obj);//object
print(typeof array);//object
運(yùn)行結(jié)果顯示,對(duì)象obj和數(shù)組array的typeof值均為”object”,這樣我們就無法準(zhǔn)確判斷了,這時(shí)候,可以通過調(diào)用instanceof來進(jìn)行進(jìn)一步的判斷:
print(obj instanceof Array);//false
print(array instanceof Array);//true
第一行代碼返回false,第二行則返回true。因此,我們可以將typeof操作符和instanceof操作符結(jié)合起來進(jìn)行判斷。
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。