在JavaScript中四種基本的數(shù)據(jù)類型:數(shù)值(整數(shù)和實數(shù))、字符串型(用“”號或‘'括起來的字符或數(shù)值)、布爾型(使True或False表示)和空值。在JavaScript的基本類型中的數(shù)據(jù)可以是常量,也可以變量。由于JavaScript采用弱類型的形式,因而一個數(shù)據(jù)的變量或常量不必首先作聲明,而是在使用或賦值時確定其數(shù)據(jù)的類型的。當然也可以先聲明該數(shù)據(jù)的類型,它是通過在賦值時自動說明其數(shù)據(jù)類型的。
javascript中的變量
javascript中的變量只是一個占位符,前言已經(jīng)說過了,因為松散類型的緣故。
定義變量:
var name;
上述代碼定義了一個名為name的變量,該變量可以用來保存任何值(像這樣未經(jīng)過初始化的變量,會保存一個特殊的值--undefined),也可以初始化變量的值,
var name =”jwy”; //javascript 中的單引號和雙引號沒有區(qū)別,不過要注意正確嵌套name=10;
一開始name初始化成了字符串值“jwy”,后又改成了數(shù)字值―100,這種做法是不建議的,但是在ECMAScript是有效果的,而且在很多時候會這樣做。
也可以一條語句定義多個變量,而且很多javascript框架是這么做的
var name=”jwy”,author,age=29;
每條語句加分號是很好的編程習慣。不過一條多個變量時,建議換行和縮進,這樣可以提高可讀性。
簡單數(shù)據(jù)類型
ECMAScript中有5種簡單數(shù)據(jù)類型:Undefined,Null,Boolea,Number和String。還有一種復雜數(shù)據(jù)類型―Object
typeof操作符
由于Javascript中的變量是松散類型的,所以它提供了一種檢測當前變量的數(shù)據(jù)類型的方法,也就是typeof關鍵字,在上面提到的ECMAScript中的5種簡單數(shù)據(jù)類型中,(記住,這5種只是數(shù)據(jù)類型,代表一種數(shù)據(jù)類型,就想C#中的int,string類型一樣),通過typeof關鍵字,對這5種數(shù)據(jù)類型會返回下面的值(以字符串形式顯示
“undefined” ---------- 如果值未定義 Undefined
“boolean” ---------- 如果這個值是布爾值 Boolean
“string” ---------- 如果這個值是字符串 String
“number” ---------- 如果這個值是數(shù)值類型 Number
“object” ---------- 如果這個值是對象或null Object
“function” ---------- 如果這個值是函數(shù) Function
不過嚴格來說,函數(shù)在ECMAScript中是對象,每個函數(shù)都是Function這個類的一個實例,既然函數(shù)是一個對象,那么它也就是一個引用類型了,所以一個函數(shù)只是一個變量名而已,因此,在很多場合常常可以看到,將函數(shù)名作為參數(shù),傳進函數(shù)中,然后進行調(diào)用,這就類似于C#中的委托,在后面會詳細的講解函數(shù)這個東西,畢竟Javascript中很多東西都依賴于函數(shù)來實現(xiàn)。
Undefined 類型
上面說了,5種類型是數(shù)據(jù)類型,所以數(shù)據(jù)類型是有值的,Undefined的值就是undefined,注意,是u是小寫的。如果聲明變量卻沒有初始化,則當前變量的值就是undefined。不過,一般建議盡量給變量初始化,但是在早期的Javascript版本中是沒有規(guī)定undefined這個值的,所以在有些框架中為了兼容舊版瀏覽器,會給window對象添加undefined值,如下:
window['undefined'] = window['undefined']; //或者window.undefined = window.undefined;
簡單的說就是給window對象的undefined屬性賦上undefined,在較老的瀏覽器對象并沒有undefined這個屬性,所以如果使用到undefined的操作將會導致失常,故采用這樣的方式,不過一開始看會有點難理解,在舊版本的瀏覽器中會因為沒有window.undefined這個對象而返回一個undefined值,所以這樣做可以兼容舊瀏覽器。
不過包含undefined值的變量與未定義的變量是不一樣的,如:
var name;alert(name);//undefinedalert(age);// 錯誤:age is not defined
還沒聲明過的變量只能執(zhí)行一項操作,其他全都不能做,就是使用typeof操作符檢測其數(shù)據(jù)類型。
如果不管聲明過未初始化以及未聲明過的變量執(zhí)行typeof都是返回undefined的值。兩種變來那個都不能執(zhí)行真正的操作
Null類型
Null類型的值是null,它表示一個空對象指針,沒有指向任何對象,如果一個變量的值是null,那當前變量很有可能就是垃圾收集的對象,使用typeof監(jiān)測null值時會返回”object”,
var person = null;alert(typeof person);//”object”
建議:如果變量是要用來保存對象的額,則初始化為null,這樣到時就可以檢測該變量是否已經(jīng)保存了一個對象的引用的,
注意:undefined值是派生自null的,所以對他們執(zhí)行相等測試會返回true,如:
alert(null == undefind);//true
盡管如此,但是他們用途完全不同,無論在什么情況下都沒必要將一個變量的值顯示設為undefined,但是這個規(guī)則對null卻不適用。
Boolean類型
這個類型只有兩個值:true 和false。雖然只有兩個值,但是javascript中所有類型的值都有與這兩個值等價的值。要將一個值轉(zhuǎn)換為對應的Boolean值,可以調(diào)用轉(zhuǎn)型函數(shù)Boolean() (其實Boolean ,Object,String,Number,Function等這些都是一個函數(shù),構造函數(shù),同樣也可以理解為一個類,用類型調(diào)用toString()方法會返回這樣的東西:
"function Function() { [native code] }" ,F(xiàn)unction會相應的改成各自的那個調(diào)用函數(shù) )
其實在 if 語句判斷中,會對里面的條件自動執(zhí)行Boolean變化的。
Number類型
數(shù)值類型有很多值,最基本的當然就是十進制啦,如:
var num=510;
除了十進制,整數(shù)還可以通過八進制或十六進制,其中八進制字面值第一位必須是0,然后是八進制數(shù)字序列,如果字面值中的數(shù)值超出了范圍,那么前導零將被忽略。后面的額數(shù)值將被當做十進制數(shù)解析。
var num1=070;//八進制的56
var num2 =079;//無效的八進制―解析為79
var num3 =08;// 無效的八進制―解析為8
而十六進制前面則必須是0x,后跟十六進制數(shù)字(0~F),不分大小寫。如:
var num1 = 0xA;var num2 = 0x1f;
雖然可以表示為八進制和十六進制,但是計算時會被轉(zhuǎn)換成十進制值。
除了整數(shù),還有浮點數(shù)值,當然了,沒有像其他強類型語言中的float之類的關鍵字了。
var num1 = 1.1;var num2 =0.1;var num3 = .1;//有效,但不推薦
在保存整數(shù)時內(nèi)存分配大小只有浮點數(shù)的1/2,所以當浮點數(shù)可以轉(zhuǎn)換為整數(shù)時,javascript會自動轉(zhuǎn)換為整數(shù)。
當然了,除了這些數(shù)值比較小的,還有一些極大或極小的數(shù)值,可以用科學計數(shù)法表示,
var num=123.456e10;
浮點數(shù)值的最高精度是17位小數(shù),但是計算時其精確度遠遠不如整數(shù)。例如 ,0.1+0.2不等于0.3,而是0.3000000000000004,所以在做判斷時,千萬不要用浮點數(shù)相加判斷等于預想中的某個值。
在javascript中數(shù)值最小的是Number.MIN_VALUE,這里可以想象成Number是一個類,而MIN_VALUE 是一個靜態(tài)變量,儲存最小值,同樣,最大的是Number.MAX_VALUE。
如果計算中超出了這個最大值和最小值范圍,則將被自動轉(zhuǎn)換成Infinity值,如果是負數(shù),就是-Infinity,整數(shù)就是Infinity,Infinity的意思是無窮,也就是正負無窮,跟數(shù)學中的概念是一樣的。但是Infinity是無法參與計算的。可以用原生函數(shù)確定是不是有窮:isFinite();只有位于數(shù)值范圍內(nèi)才會返回true。
在Javascript中數(shù)值除了那些普通的整數(shù)、浮點數(shù)、最大值、最小值、無窮之外呢,還有一個特殊的值,就是NaN。這個數(shù)值用于表示一個本來要返回數(shù)值的操作數(shù)未返回數(shù)值的情況。比如,在C#中任何數(shù)值除以0都會報錯,拋出異常,但是在Javascript中,任何數(shù)值除以0會返回Nan,因此不會影響代碼的執(zhí)行。
NaN的特點:
1、任何設計NaN的操作(如:NaN/0)都會返回NaN.
2、NaN與任何值都不相等,包括NaN本身。如:
alert(NaN == NaN);//false
所以Javascript中有一個isNaN()函數(shù),這個函數(shù)接收一個參數(shù),任意類型,它會幫我們確定這個參數(shù)是否”不是數(shù)值”。它會先嘗試先講這個值轉(zhuǎn)為數(shù)值。如果不能被轉(zhuǎn)換為數(shù)值的值在調(diào)用這個函數(shù)之后會返回true,即is NaN 非數(shù)值。
至于數(shù)值轉(zhuǎn)換,這個內(nèi)容在Javascript中擴展開來又是一篇文章,有時間再整理整理。
String類型
字符串可以由單引號或雙引號表示,在Javascript中這兩種引號是等價的,如:
var name = ‘jwy';var author = “jwy”;
不過就是要注意正確嵌套。
字符串可以直接用字面量賦值。任何字符串的長度都可以通過訪問氣length屬性獲得。
在Javascript中的字符串是不可變的,其實這跟C#中是一樣的,(估計也是為了提高性能),字符串一旦創(chuàng)建,他們的值就不能改變,要改變某個變量保存的字符串,首先要銷毀原來的字符串,然后再用另一個包含信紙的字符串填充該變量。
var name=”jwy”;name = “jwy”+” study javascript”;
這里一開始name是保存字符串”jwy”的,第二行代碼則將“jwy”+” study javascript”; 值重新賦給name,它先床架一個能容納這個長度的新字符串,然后填充,銷毀原來的字符串。
幾乎每個值都有自己的toString()方法,在后面的文章會解釋這個方法哪里來的,它會返回相應值的字符串表現(xiàn)。
var age=11;var ageToString =age.toString();//”11”
數(shù)值、布爾值、對象和字符串值都有toString(),但是null和undefined值沒有這個方法。
一般來說,調(diào)用toString()方法不必傳遞參數(shù),但是,在調(diào)用數(shù)值的toString方法時,可以傳遞一個參數(shù),用來指定要輸出的數(shù)值的基數(shù)(看是要輸出十進制、二進制、八進制、十六進制表示)
由于null和undefined沒有toString方法,在不知道是否是這兩者的情況下調(diào)用是會報錯的,所以還有一條路可以選,就是使用轉(zhuǎn)型函數(shù)String(),它呢就可以接收任何類型的值轉(zhuǎn)為字符串了,處理規(guī)則如下:
1、如果這個值有toString則直接調(diào)用,并返回結(jié)果
2、如果是null,則返回”null”
3、如果是unde,則返回”undefined”
Object 類型
Object類型是Javascript引用類型的鼻祖了,(就跟在C#和Java中是一樣的道理),在創(chuàng)建Object類型的實例后可以為其添加屬性和方法,
var o = new Object;//有效,不推薦var o =new Object();
在Javascript中,Object類型所具有的任何屬性和方法也同樣存在于更具體的對象中。
每個實例都有如下的屬性和方法,如下:
1、constructor ,保存著用于創(chuàng)建當前對象的函數(shù)。上面構造函數(shù)就是Object();
2、hasOwnProperty,用于檢查給定的屬性是否在當前對象實例中,是就true,不是在實例中,而是在原型中,則是false;
3、isPrototypeOf,用于檢查傳入的對象是否是另一個對象的原型
4、propertyIsEnumerable,用于檢查給定的屬性是否能夠使用for…in語句來枚舉,
5、toString,返回對象的字符串表示
6、valueOf,返回對象的字符串、數(shù)值或布爾值表示,通常與toString方法返回值相同
以上就是Object所具有的屬性和方法,所有對象都會因為繼承關系而繼承這些屬性和方法。
結(jié)束語
Undefined、Null、Boolean、Number、String是javascript中的基本數(shù)據(jù)類型,而Object屬于引用類型。用typeof檢測其他類型會返回相應的字符串,但是檢測null或?qū)ο髸r,會返回”object",如果掌握了這些,以后就不會看到這些會點摸不著頭腦了。順帶提一句:
Boolean、Number、String 這三個是Javascript中的基本包裝類型,也就是這三個其實是一個構造函數(shù),他們是Function的實例,是引用類型,至于這里的String與文章說的String是同名,是因為其實上文說的String是指字符串,這里的String指的是String這個構造函數(shù),上面那么寫,是為了更好的理解,因為Javascript是松散類型的。我們可以看下String實例化的例子:
var name = String("jwy");alert(typeof name);//"object"var author = "Tom";alert(typeof name);//"string"
至于author這個會有l(wèi)ength,substring等等這些方法,其實是String這里的方面,string只是String的一個實例,類似于C#中的String,和string,只不過這里特殊一點。
注意,typeof 變量 如果值是"string" 的話,也就是這個變量是字符串,在Javascript中,字符串是基本類型,而在C#或Java中,字符串是引用類型,但是Javascript中的String是引用類型,因為它是Javascript中定義好的基本包裝類型,在C#中,String跟string其實是一樣的。這個東西有點繞,如果有錯的,大家請指出來,一起交流交流。
JavaScript中的值類型和引用類型
一、擁抱JavaScript
曾經(jīng)名不經(jīng)傳的JavaScript隨著AJAX的流行而身價倍增,現(xiàn)在JavaScript不再僅僅是WEB開發(fā)中一個可有可無的輔助工具,甚至有了專門屬于它的職位“JavaScript工程師”,那怕你僅僅是一名WEB后臺開發(fā)程序員,你都必須了解JavaScript,至少在一些相關招聘職位要求上你可以看到“熟悉JavaScript優(yōu)先”的字眼。甚至我還要告訴你,你將可以用JavaScript開發(fā)桌面軟件,這得益于Adobe AIR的另外一種開發(fā)模式,即用HTML+CSS+JavaScript開發(fā)AIR。
二、值類型和引用類型話題
隨著部分有大型面向?qū)ο笳Z言基礎朋友的介入,他們試著用JavaScript去模擬面像對象的各種特征,盡管有些模擬顯得較為牽強,但也讓我們見識到了JavaScript的強大與靈活性。本文暫不探討JavaScript面向?qū)ο缶幊碳夹g。就講講JavaScript中的兩種變量類型:即值類型和引用類型,這通常又會讓你聯(lián)想到“堆棧”,另外還有“引用地址”或“指針”相關概念,有過Java或C#編程經(jīng)驗的人相信對這兩種類型不陌生。下面就舉例講一下這兩種類型在JavaScript中的體現(xiàn)、用法及注意事項。
三、JavaScript值類型和引用類型有哪些
(1)值類型:數(shù)值、布爾值、null、undefined。
(2)引用類型:對象、數(shù)組、函數(shù)。
四、如何理解值類型和引用類型及舉例
我們可以用“連鎖店”和“連鎖店鑰匙”來理解,不知道以下比喻合不合適,^-^。
(1)值類型理解:變量的交換等于在一個新的地方按照連鎖店的規(guī)范標準(統(tǒng)一店面理解為相同的變量內(nèi)容)新開一個分店,這樣新開的店與其它舊店互不相關、各自運營。
值類型例子
function chainStore(){ var store1='Nike China'; var store2=store1; store1='Nike U.S.A.'; alert(store2); //Nike China}chainStore();//把一個值類型(也可以叫基本類型)store2傳遞給另一個變量(賦值)時,其實是分配了一塊新的內(nèi)存空間,因此改變store1的值對store2沒有任何影響,因為它不像引用類型,變量的交換其實是交換了指像同一個內(nèi)容的地址。
(2)引用類型理解:變量的交換等于把現(xiàn)有一間店的鑰匙(變量引用地址)復制一把給了另外一個老板,此時兩個老板同時管理一間店,兩個老板的行為都有可能對一間店的運營造成影響。
引用類型例子
function chainStore(){ var store1=['Nike China']; var store2=store1; alert(store2[0]); //Nike China store1[0]='Nike U.S.A.'; alert(store2[0]); //Nike U.S.A.}chainStore();//在上面的代碼中,store2只進行了一次賦值,理論上它的值已定,但后面通過改寫store1的值,發(fā)現(xiàn)store2的值也發(fā)生了改變,這正是引用類型的特征,也是我們要注意的地方。
新聞熱點
疑難解答