在JavaScript中四種基本的數(shù)據(jù)類型:數(shù)值(整數(shù)和實(shí)數(shù))、字符串型(用“”號(hào)或‘"括起來的字符或數(shù)值)、布爾型(使True或False表示)和空值。在JavaScript的基本類型中的數(shù)據(jù)可以是常量,也可以變量。由于JavaScript采用弱類型的形式,因而一個(gè)數(shù)據(jù)的變量或常量不必首先作聲明,而是在使用或賦值時(shí)確定其數(shù)據(jù)的類型的。當(dāng)然也可以先聲明該數(shù)據(jù)的類型,它是通過在賦值時(shí)自動(dòng)說明其數(shù)據(jù)類型的。
javascript中的變量
javascript中的變量只是一個(gè)占位符,前言已經(jīng)說過了,因?yàn)樗缮㈩愋偷木壒省?
定義變量:
var name;
上述代碼定義了一個(gè)名為name的變量,該變量可以用來保存任何值(像這樣未經(jīng)過初始化的變量,會(huì)保存一個(gè)特殊的值--undefined),也可以初始化變量的值,
var name =”jwy”; //javascript 中的單引號(hào)和雙引號(hào)沒有區(qū)別,不過要注意正確嵌套name=10;
一開始name初始化成了字符串值“jwy”,后又改成了數(shù)字值—100,這種做法是不建議的,但是在ECMAScript是有效果的,而且在很多時(shí)候會(huì)這樣做。
也可以一條語句定義多個(gè)變量,而且很多javascript框架是這么做的
var name=”jwy”,author,age=29;
每條語句加分號(hào)是很好的編程習(xí)慣。不過一條多個(gè)變量時(shí),建議換行和縮進(jìn),這樣可以提高可讀性。
簡(jiǎn)單數(shù)據(jù)類型
ECMAScript中有5種簡(jiǎn)單數(shù)據(jù)類型:Undefined,Null,Boolea,Number和String。還有一種復(fù)雜數(shù)據(jù)類型—Object
typeof操作符
由于Javascript中的變量是松散類型的,所以它提供了一種檢測(cè)當(dāng)前變量的數(shù)據(jù)類型的方法,也就是typeof關(guān)鍵字,在上面提到的ECMAScript中的5種簡(jiǎn)單數(shù)據(jù)類型中,(記住,這5種只是數(shù)據(jù)類型,代表一種數(shù)據(jù)類型,就想C#中的int,string類型一樣),通過typeof關(guān)鍵字,對(duì)這5種數(shù)據(jù)類型會(huì)返回下面的值(以字符串形式顯示
“undefined” ---------- 如果值未定義 Undefined
“boolean” ---------- 如果這個(gè)值是布爾值 Boolean
“string” ---------- 如果這個(gè)值是字符串 String
“number” ---------- 如果這個(gè)值是數(shù)值類型 Number
“object” ---------- 如果這個(gè)值是對(duì)象或null Object
“function” ---------- 如果這個(gè)值是函數(shù) Function
不過嚴(yán)格來說,函數(shù)在ECMAScript中是對(duì)象,每個(gè)函數(shù)都是Function這個(gè)類的一個(gè)實(shí)例,既然函數(shù)是一個(gè)對(duì)象,那么它也就是一個(gè)引用類型了,所以一個(gè)函數(shù)只是一個(gè)變量名而已,因此,在很多場(chǎng)合常常可以看到,將函數(shù)名作為參數(shù),傳進(jìn)函數(shù)中,然后進(jìn)行調(diào)用,這就類似于C#中的委托,在后面會(huì)詳細(xì)的講解函數(shù)這個(gè)東西,畢竟Javascript中很多東西都依賴于函數(shù)來實(shí)現(xiàn)。
Undefined 類型
上面說了,5種類型是數(shù)據(jù)類型,所以數(shù)據(jù)類型是有值的,Undefined的值就是undefined,注意,是u是小寫的。如果聲明變量卻沒有初始化,則當(dāng)前變量的值就是undefined。不過,一般建議盡量給變量初始化,但是在早期的Javascript版本中是沒有規(guī)定undefined這個(gè)值的,所以在有些框架中為了兼容舊版瀏覽器,會(huì)給window對(duì)象添加undefined值,如下:
window["undefined"] = window["undefined"]; //或者window.undefined = window.undefined;
簡(jiǎn)單的說就是給window對(duì)象的undefined屬性賦上undefined,在較老的瀏覽器對(duì)象并沒有undefined這個(gè)屬性,所以如果使用到undefined的操作將會(huì)導(dǎo)致失常,故采用這樣的方式,不過一開始看會(huì)有點(diǎn)難理解,在舊版本的瀏覽器中會(huì)因?yàn)闆]有window.undefined這個(gè)對(duì)象而返回一個(gè)undefined值,所以這樣做可以兼容舊瀏覽器。
不過包含undefined值的變量與未定義的變量是不一樣的,如:
var name; alert(name);//undefinedalert(age);// 錯(cuò)誤:age is not defined
還沒聲明過的變量只能執(zhí)行一項(xiàng)操作,其他全都不能做,就是使用typeof操作符檢測(cè)其數(shù)據(jù)類型。
如果不管聲明過未初始化以及未聲明過的變量執(zhí)行typeof都是返回undefined的值。兩種變來那個(gè)都不能執(zhí)行真正的操作
Null類型
Null類型的值是null,它表示一個(gè)空對(duì)象指針,沒有指向任何對(duì)象,如果一個(gè)變量的值是null,那當(dāng)前變量很有可能就是垃圾收集的對(duì)象,使用typeof監(jiān)測(cè)null值時(shí)會(huì)返回”object”,
var person = null;alert(typeof person);//”object”
建議:如果變量是要用來保存對(duì)象的額,則初始化為null,這樣到時(shí)就可以檢測(cè)該變量是否已經(jīng)保存了一個(gè)對(duì)象的引用的,
注意:undefined值是派生自null的,所以對(duì)他們執(zhí)行相等測(cè)試會(huì)返回true,如:
alert(null == undefind);//true
盡管如此,但是他們用途完全不同,無論在什么情況下都沒必要將一個(gè)變量的值顯示設(shè)為undefined,但是這個(gè)規(guī)則對(duì)null卻不適用。
Boolean類型
這個(gè)類型只有兩個(gè)值:true 和false。雖然只有兩個(gè)值,但是javascript中所有類型的值都有與這兩個(gè)值等價(jià)的值。要將一個(gè)值轉(zhuǎn)換為對(duì)應(yīng)的Boolean值,可以調(diào)用轉(zhuǎn)型函數(shù)Boolean() (其實(shí)Boolean ,Object,String,Number,Function等這些都是一個(gè)函數(shù),構(gòu)造函數(shù),同樣也可以理解為一個(gè)類,用類型調(diào)用toString()方法會(huì)返回這樣的東西:
"function Function() { [native code] }" ,F(xiàn)unction會(huì)相應(yīng)的改成各自的那個(gè)調(diào)用函數(shù) )
其實(shí)在 if 語句判斷中,會(huì)對(duì)里面的條件自動(dòng)執(zhí)行Boolean變化的。
Number類型
數(shù)值類型有很多值,最基本的當(dāng)然就是十進(jìn)制啦,如:
var num=510;
除了十進(jìn)制,整數(shù)還可以通過八進(jìn)制或十六進(jìn)制,其中八進(jìn)制字面值第一位必須是0,然后是八進(jìn)制數(shù)字序列,如果字面值中的數(shù)值超出了范圍,那么前導(dǎo)零將被忽略。后面的額數(shù)值將被當(dāng)做十進(jìn)制數(shù)解析。
var num1=070;//八進(jìn)制的56var num2 =079;//無效的八進(jìn)制—解析為79var num3 =08;// 無效的八進(jìn)制—解析為8
而十六進(jìn)制前面則必須是0x,后跟十六進(jìn)制數(shù)字(0~F),不分大小寫。如:
var num1 = 0xA;var num2 = 0x1f;
雖然可以表示為八進(jìn)制和十六進(jìn)制,但是計(jì)算時(shí)會(huì)被轉(zhuǎn)換成十進(jìn)制值。
除了整數(shù),還有浮點(diǎn)數(shù)值,當(dāng)然了,沒有像其他強(qiáng)類型語言中的float之類的關(guān)鍵字了。
var num1 = 1.1; var num2 =0.1;var num3 = .1;//有效,但不推薦
在保存整數(shù)時(shí)內(nèi)存分配大小只有浮點(diǎn)數(shù)的1/2,所以當(dāng)浮點(diǎn)數(shù)可以轉(zhuǎn)換為整數(shù)時(shí),javascript會(huì)自動(dòng)轉(zhuǎn)換為整數(shù)。
當(dāng)然了,除了這些數(shù)值比較小的,還有一些極大或極小的數(shù)值,可以用科學(xué)計(jì)數(shù)法表示,
var num=123.456e10;
浮點(diǎn)數(shù)值的最高精度是17位小數(shù),但是計(jì)算時(shí)其精確度遠(yuǎn)遠(yuǎn)不如整數(shù)。例如 ,0.1+0.2不等于0.3,而是0.3000000000000004,所以在做判斷時(shí),千萬不要用浮點(diǎn)數(shù)相加判斷等于預(yù)想中的某個(gè)值。
在javascript中數(shù)值最小的是Number.MIN_VALUE,這里可以想象成Number是一個(gè)類,而MIN_VALUE 是一個(gè)靜態(tài)變量,儲(chǔ)存最小值,同樣,最大的是Number.MAX_VALUE。
如果計(jì)算中超出了這個(gè)最大值和最小值范圍,則將被自動(dòng)轉(zhuǎn)換成Infinity值,如果是負(fù)數(shù),就是-Infinity,整數(shù)就是Infinity,Infinity的意思是無窮,也就是正負(fù)無窮,跟數(shù)學(xué)中的概念是一樣的。但是Infinity是無法參與計(jì)算的??梢杂迷瘮?shù)確定是不是有窮:isFinite();只有位于數(shù)值范圍內(nèi)才會(huì)返回true。
在Javascript中數(shù)值除了那些普通的整數(shù)、浮點(diǎn)數(shù)、最大值、最小值、無窮之外呢,還有一個(gè)特殊的值,就是NaN。這個(gè)數(shù)值用于表示一個(gè)本來要返回?cái)?shù)值的操作數(shù)未返回?cái)?shù)值的情況。比如,在C#中任何數(shù)值除以0都會(huì)報(bào)錯(cuò),拋出異常,但是在Javascript中,任何數(shù)值除以0會(huì)返回Nan,因此不會(huì)影響代碼的執(zhí)行。
NaN的特點(diǎn):
1、任何設(shè)計(jì)NaN的操作(如:NaN/0)都會(huì)返回NaN.
2、NaN與任何值都不相等,包括NaN本身。如:
alert(NaN == NaN);//false
所以Javascript中有一個(gè)isNaN()函數(shù),這個(gè)函數(shù)接收一個(gè)參數(shù),任意類型,它會(huì)幫我們確定這個(gè)參數(shù)是否”不是數(shù)值”。它會(huì)先嘗試先講這個(gè)值轉(zhuǎn)為數(shù)值。如果不能被轉(zhuǎn)換為數(shù)值的值在調(diào)用這個(gè)函數(shù)之后會(huì)返回true,即is NaN 非數(shù)值。
至于數(shù)值轉(zhuǎn)換,這個(gè)內(nèi)容在Javascript中擴(kuò)展開來又是一篇文章,有時(shí)間再整理整理。
String類型
字符串可以由單引號(hào)或雙引號(hào)表示,在Javascript中這兩種引號(hào)是等價(jià)的,如:
var name = ‘jwy";var author = “jwy”;
不過就是要注意正確嵌套。
字符串可以直接用字面量賦值。任何字符串的長(zhǎng)度都可以通過訪問氣length屬性獲得。
在Javascript中的字符串是不可變的,其實(shí)這跟C#中是一樣的,(估計(jì)也是為了提高性能),字符串一旦創(chuàng)建,他們的值就不能改變,要改變某個(gè)變量保存的字符串,首先要銷毀原來的字符串,然后再用另一個(gè)包含信紙的字符串填充該變量。
var name=”jwy”;name = “jwy”+” study javascript”;
這里一開始name是保存字符串”jwy”的,第二行代碼則將“jwy”+” study javascript”; 值重新賦給name,它先床架一個(gè)能容納這個(gè)長(zhǎng)度的新字符串,然后填充,銷毀原來的字符串。
幾乎每個(gè)值都有自己的toString()方法,在后面的文章會(huì)解釋這個(gè)方法哪里來的,它會(huì)返回相應(yīng)值的字符串表現(xiàn)。
var age=11;var ageToString =age.toString();//”11”
數(shù)值、布爾值、對(duì)象和字符串值都有toString(),但是null和undefined值沒有這個(gè)方法。
一般來說,調(diào)用toString()方法不必傳遞參數(shù),但是,在調(diào)用數(shù)值的toString方法時(shí),可以傳遞一個(gè)參數(shù),用來指定要輸出的數(shù)值的基數(shù)(看是要輸出十進(jìn)制、二進(jìn)制、八進(jìn)制、十六進(jìn)制表示)
由于null和undefined沒有toString方法,在不知道是否是這兩者的情況下調(diào)用是會(huì)報(bào)錯(cuò)的,所以還有一條路可以選,就是使用轉(zhuǎn)型函數(shù)String(),它呢就可以接收任何類型的值轉(zhuǎn)為字符串了,處理規(guī)則如下:
1、如果這個(gè)值有toString則直接調(diào)用,并返回結(jié)果
2、如果是null,則返回”null”
3、如果是unde,則返回”undefined”
Object 類型
Object類型是Javascript引用類型的鼻祖了,(就跟在C#和Java中是一樣的道理),在創(chuàng)建Object類型的實(shí)例后可以為其添加屬性和方法,
var o = new Object;//有效,不推薦var o =new Object();
在Javascript中,Object類型所具有的任何屬性和方法也同樣存在于更具體的對(duì)象中。
每個(gè)實(shí)例都有如下的屬性和方法,如下:
1、constructor ,保存著用于創(chuàng)建當(dāng)前對(duì)象的函數(shù)。上面構(gòu)造函數(shù)就是Object();
2、hasOwnProperty,用于檢查給定的屬性是否在當(dāng)前對(duì)象實(shí)例中,是就true,不是在實(shí)例中,而是在原型中,則是false;
3、isPrototypeOf,用于檢查傳入的對(duì)象是否是另一個(gè)對(duì)象的原型
4、propertyIsEnumerable,用于檢查給定的屬性是否能夠使用for…in語句來枚舉,
5、toString,返回對(duì)象的字符串表示
6、valueOf,返回對(duì)象的字符串、數(shù)值或布爾值表示,通常與toString方法返回值相同
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com