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