JavaScript基本數(shù)據(jù)類型及值類型和引用類型
在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)樗缮㈩愋偷木壒省?nbsp;
定義變量:
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);//undefined alert(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)制的56
var num2 =079;//無效的八進(jìn)制—解析為79
var 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方法返回值相同
以上就是Object所具有的屬性和方法,所有對(duì)象都會(huì)因?yàn)槔^承關(guān)系而繼承這些屬性和方法。
結(jié)束語
Undefined、Null、Boolean、Number、String是javascript中的基本數(shù)據(jù)類型,而Object屬于引用類型。用typeof檢測(cè)其他類型會(huì)返回相應(yīng)的字符串,但是檢測(cè)null或?qū)ο髸r(shí),會(huì)返回”object",如果掌握了這些,以后就不會(huì)看到這些會(huì)點(diǎn)摸不著頭腦了。順帶提一句:
Boolean、Number、String 這三個(gè)是Javascript中的基本包裝類型,也就是這三個(gè)其實(shí)是一個(gè)構(gòu)造函數(shù),他們是Function的實(shí)例,是引用類型,至于這里的String與文章說的String是同名,是因?yàn)槠鋵?shí)上文說的String是指字符串,這里的String指的是String這個(gè)構(gòu)造函數(shù),上面那么寫,是為了更好的理解,因?yàn)镴avascript是松散類型的。我們可以看下String實(shí)例化的例子:
var name = String("jwy");
alert(typeof name);//"object"
var author = "Tom";
alert(typeof name);//"string"
至于author這個(gè)會(huì)有l(wèi)ength,substring等等這些方法,其實(shí)是String這里的方面,string只是String的一個(gè)實(shí)例,類似于C#中的String,和string,只不過這里特殊一點(diǎn)。
注意,typeof 變量 如果值是"string" 的話,也就是這個(gè)變量是字符串,在Javascript中,字符串是基本類型,而在C#或Java中,字符串是引用類型,但是Javascript中的String是引用類型,因?yàn)樗荍avascript中定義好的基本包裝類型,在C#中,String跟string其實(shí)是一樣的。這個(gè)東西有點(diǎn)繞,如果有錯(cuò)的,大家請(qǐng)指出來,一起交流交流。
JavaScript中的值類型和引用類型
一、擁抱JavaScript
曾經(jīng)名不經(jīng)傳的JavaScript隨著AJAX的流行而身價(jià)倍增,現(xiàn)在JavaScript不再僅僅是WEB開發(fā)中一個(gè)可有可無的輔助工具,甚至有了專門屬于它的職位“JavaScript工程師”,那怕你僅僅是一名WEB后臺(tái)開發(fā)程序員,你都必須了解JavaScript,至少在一些相關(guān)招聘職位要求上你可以看到“熟悉JavaScript優(yōu)先”的字眼。甚至我還要告訴你,你將可以用JavaScript開發(fā)桌面軟件,這得益于Adobe AIR的另外一種開發(fā)模式,即用HTML+CSS+JavaScript開發(fā)AIR。
二、值類型和引用類型話題
隨著部分有大型面向?qū)ο笳Z言基礎(chǔ)朋友的介入,他們?cè)囍肑avaScript去模擬面像對(duì)象的各種特征,盡管有些模擬顯得較為牽強(qiáng),但也讓我們見識(shí)到了JavaScript的強(qiáng)大與靈活性。本文暫不探討JavaScript面向?qū)ο缶幊碳夹g(shù)。就講講JavaScript中的兩種變量類型:即值類型和引用類型,這通常又會(huì)讓你聯(lián)想到“堆?!保硗膺€有“引用地址”或“指針”相關(guān)概念,有過Java或C#編程經(jīng)驗(yàn)的人相信對(duì)這兩種類型不陌生。下面就舉例講一下這兩種類型在JavaScript中的體現(xiàn)、用法及注意事項(xiàng)。
三、JavaScript值類型和引用類型有哪些
(1)值類型:數(shù)值、布爾值、null、undefined。
(2)引用類型:對(duì)象、數(shù)組、函數(shù)。
四、如何理解值類型和引用類型及舉例
我們可以用“連鎖店”和“連鎖店鑰匙”來理解,不知道以下比喻合不合適,^-^。
(1)值類型理解:變量的交換等于在一個(gè)新的地方按照連鎖店的規(guī)范標(biāo)準(zhǔn)(統(tǒng)一店面理解為相同的變量?jī)?nèi)容)新開一個(gè)分店,這樣新開的店與其它舊店互不相關(guān)、各自運(yùn)營(yíng)。
值類型例子
function chainStore()
{
var store1='Nike China';
var store2=store1;
store1='Nike U.S.A.';
alert(store2); //Nike China
}
chainStore();
//把一個(gè)值類型(也可以叫基本類型)store2傳遞給另一個(gè)變量(賦值)時(shí),其實(shí)是分配了一塊新的內(nèi)存空間,因此改變store1的值對(duì)store2沒有任何影響,因?yàn)樗幌褚妙愋?,變量的交換其實(shí)是交換了指像同一個(gè)內(nèi)容的地址。
(2)引用類型理解:變量的交換等于把現(xiàn)有一間店的鑰匙(變量引用地址)復(fù)制一把給了另外一個(gè)老板,此時(shí)兩個(gè)老板同時(shí)管理一間店,兩個(gè)老板的行為都有可能對(duì)一間店的運(yùn)營(yíng)造成影響。
引用類型例子
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只進(jìn)行了一次賦值,理論上它的值已定,但后面通過改寫store1的值,發(fā)現(xiàn)store2的值也發(fā)生了改變,這正是引用類型的特征,也是我們要注意的地方。
相關(guān)文章
通過JAVAScript實(shí)現(xiàn)頁面自適應(yīng)
通過JAVAScript實(shí)現(xiàn)頁面自適應(yīng)...2007-01-01
JavaScript中var let const的用法有哪些區(qū)別
javascript中動(dòng)態(tài)加載js文件多種解決辦法總結(jié)
innerhtml用法 innertext用法 以及innerHTML與innertext的區(qū)別
微信小程序?qū)崿F(xiàn)動(dòng)態(tài)渲染Markdown示例詳解

