在javascript中,引用數(shù)據(jù)類型是一種數(shù)據(jù)結(jié)構,用于將數(shù)據(jù)和功能組織在一起;它也常被稱為類。引用類型的值是保存在內(nèi)存中的對象(同時保存在棧內(nèi)存和堆內(nèi)存中);引用類型的值是按引用訪問的。
本教程操作環(huán)境:windows7系統(tǒng)、javascript1.8.5版、Dell G3電腦。
數(shù)據(jù)類型指的是可以在程序中存儲和操作的值的類型,每種編程語言都有其支持的數(shù)據(jù)類型,不同的數(shù)據(jù)類型用來存儲不同的數(shù)據(jù),例如文本、數(shù)值、圖像等。
JavaScript 中的數(shù)據(jù)類型可以分為兩種類型:
-
基本數(shù)據(jù)類型(值類型):字符串(String)、數(shù)字(Number)、布爾(Boolean)、空(Null)、未定義(Undefined)、Symbol;
-
引用數(shù)據(jù)類型:對象(Object)、數(shù)組(Array)、函數(shù)(Function)。
JavaScript引用數(shù)據(jù)類型
引用類型
在ECMAScript中,引用類型是一種數(shù)據(jù)結(jié)構,用于將數(shù)據(jù)和功能組織在一起(它也常被稱為類)。
引用類型的值是保存在內(nèi)存中的對象(同時保存在棧內(nèi)存和堆內(nèi)存中)。JavaScript 不允許直接訪問內(nèi)存中的位置,因此在操作對象時,實際上是操作的對象的引用而不是實際的對象。引用類型的值按引用訪問。
Object類型
創(chuàng)建Object實例的方式有兩種。第一種是使用new操作符后跟Object構造函數(shù),例如;
var person = new Object(); person.name = "Nicholas"; person.age = 29;
另一種方式是使用對象字面量表示法。 例如:
var person = { name : "Nicholas", age ; 29 }
注意:在通過對象字面量定義對象時,實際上不會調(diào)用Object構造函數(shù)。
Array類型
創(chuàng)建數(shù)組的基本方式有兩種。第一種是使用Array構造函數(shù),例如:
var colors = new Array();
第二種基本方式是使用數(shù)組字面量表示法。數(shù)組字面量由一對包含數(shù)組項的方括號表示,多個數(shù)組項之間以逗號隔開,例如:
var colors = ["red","blue","green"];
檢測數(shù)組
instanceof操作符假定只有一個全局執(zhí)行環(huán)境。為了解決只個問題,ECMAScript 5新增了Array.isArray()方法。這個方法的目的是最終確定某個值到底是不是數(shù)組,而不管它是在哪個全局執(zhí)行環(huán)境中創(chuàng)建的。
轉(zhuǎn)換方法
toLocaleString()、toString()和valueOf()方法
所有對象都具有toLocaeString()、toString()和valueOf()方法。
調(diào)用數(shù)組的toString()方法會返回以逗號分隔的字符串;
調(diào)用toLocaleString( )和toString()一樣,但是該字符串與執(zhí)行環(huán)境的地區(qū)對應;
調(diào)用valueOf()返回的還是數(shù)組。
join()方法
join()方法只接受一個參數(shù),即用作分隔符的字符串,然后返回包含所有數(shù)組項的字符串。
棧方法(后進先出)
ECMAScript為數(shù)組專門提供了push()和pop()方法,以便實現(xiàn)類似棧的行為。push()方法可以接受任意數(shù)量的參數(shù),把他們逐個添加到數(shù)組末尾,并返回修改后數(shù)組的長度。pop()方法則從數(shù)組末尾一處最后一項,減少數(shù)組的length值,然后返回移除的項。
隊列方法(先進先出)
shift()能夠移除數(shù)組中的第一項并返回該項,同時將數(shù)組長度減一。結(jié)合使用shift()和push()方法,可以像使用隊列一樣使用數(shù)組。
ECMAScript還為數(shù)組提供了一個unshift()方法。顧名思義,unshift()與shift()的用途相反:它能在數(shù)組前端添加任意個項并返回新數(shù)組的長度。
重排序方法
reverse()方法會反轉(zhuǎn)數(shù)組項的順序。
在默認情況下,sort()方法按升序排列數(shù)組項——即最小的值位于最前面,最大的值排在最后面。為了實現(xiàn)排序,sort()方法會地哦啊用每個數(shù)組項的toString()轉(zhuǎn)型方法,然后比較得到的字符串,以確定如何排序。這種排序方式在很多情況下都不是最佳方案,因此sort()方法可以接收一個比較函數(shù)作為參數(shù),以便制定哪個值位于哪個值的前面。
reverse()和sort()方法的返回值是經(jīng)過排序之后的數(shù)組
操作方法
concat()方法可以基于當前數(shù)組中的所有項創(chuàng)建一個新數(shù)組。
slice()方法能夠基于當前數(shù)組中的一或多個項創(chuàng)建一個新數(shù)組。slice()方法可以接受一或者兩個參數(shù),即要返回項的起始和結(jié)束位置。(不會改變原數(shù)組)
splice()方法主要是向數(shù)組的中部插入值。(刪除、插入、替換)該方法改變原數(shù)組的值。
位置方法
ECMAScript為數(shù)組實例添加了兩個位置方法:indexOf()和lastindexOf()這兩個方法都返回要查找的項在數(shù)組中的位置,或者在沒有找到的情況下返回-1。這兩個方法都接受兩個參數(shù):要查找的項和表示查找起點位置的索引(可選的)。
迭代方法
ECMAScript為數(shù)組定義了五個迭代方法:
every():對數(shù)組中的每一項運行給定函數(shù),如果該函數(shù)對每一項都返回 true,則返回 true。
filter():對數(shù)組中的每一項運行給定函數(shù),返回該函數(shù)會返回 true 的項組成的數(shù)組。
forEach():對數(shù)組中的每一項運行給定函數(shù)。這個方法沒有返回值。
map():對數(shù)組中的每一項運行給定函數(shù),返回每次函數(shù)調(diào)用的結(jié)果組成的數(shù)組。
some():對數(shù)組中的每一項運行給定函數(shù),如果該函數(shù)對任一項返回 true,則返回 true。
歸并方法
ECMAScript 5 還新增了兩個歸并數(shù)組的方法:reduce()和 reduceRight()。這兩個方法都會迭代數(shù)組的所有項,然后構建一個最終返回的值。
使用 reduce()和reduceRight()方法可以執(zhí)行求數(shù)組中所有值之和的操作,比如:
var values = [1,2,3,4,5];
var sum = values.reduce(function(prev, cur, index, array){
return prev + cur;
});
alert(sum); //15
Date類型
創(chuàng)建日期對象,使用new操作符和Date構造函數(shù)即可:
var now = new Date();
在調(diào)用Date構造函數(shù)而不傳遞參數(shù)的情況下,新創(chuàng)建的對象自動獲得當前日期和時間。 為了可以接受表示日期的字符串參數(shù),ECMAScript提供了兩個方法:Date.parse()和Date.UTC()。
ECMAScript添加了Date.now()方法,返回表示調(diào)用這個方法時的日期和時間的毫秒數(shù)。
繼承的方法
Date類型也重寫了toLocaleString()、toString()和valueOf()方法。
toLocaleString()方法會按照與瀏覽器相適應的格式返回日期與時間,而toString()方法則通常返回帶有時區(qū)信息的日期和時間。至于valueOf()方法,則根本不返回字符串,而是返回日期的毫秒表示。
Function類型
函數(shù)實際上是對象,函數(shù)名實際上也是一個指向函數(shù)對象的指針,不會與某個函數(shù)綁定。每個函數(shù)都是Function類型的實例,而且都與其他引用類型一樣具有屬性和方法。
函數(shù)通常是使用函數(shù)聲明語法定義的:(函數(shù)聲明提升)
function sum (sum1,sum2) { return sum1 + sum2; }
還有一種方式,使用函數(shù)表達式定義函數(shù):
var sum = function(sum1,sum2) { return sum1 +sum2 ; };
注意:要訪問函數(shù)指針而不執(zhí)行函數(shù)的話,必須去掉函數(shù)名后面的圓括號。
函數(shù)內(nèi)部屬性
在函數(shù)內(nèi)部,有兩個特殊的對象:arguments和this。arguments是一個類數(shù)組對象,包含著傳入函數(shù)中的所有參數(shù)。該對象有一個屬性,該屬性有一個指針,指向擁有這個arguments對象的函數(shù)。this引用的是函數(shù)據(jù)以執(zhí)行的環(huán)境對象。(當在網(wǎng)頁的全局作用域中調(diào)用函數(shù)時,this對象引用的就是window)
函數(shù)屬性和方法
屬性
每個函數(shù)都包含兩個屬性:length和prototype。
length屬性表示函數(shù)希望接收的命名參數(shù)的個數(shù)。
對于ECMAScript中的引用類型而言,prototype是保存它們所有實例方法的真正所在。prototype屬性是不可枚舉的,所以使用for-in無效。
方法
每個函數(shù)都包含兩個非繼承而來的方法:apply()和call()
這兩個方法的用途都是在特定的作用域中調(diào)用函數(shù),實際上等于設置函數(shù)體內(nèi)this對象的值。作用實例:1.傳遞參數(shù) 2.擴充函數(shù)賴以運行的作用域
EAMAScript還定義了一個方法:bind()
這個方法會創(chuàng)建一個函數(shù)的實例,其this值會被綁定到傳給bind()函數(shù)的值。
每個函數(shù)繼承的toLocaleString()、toString()和valueOf()方法始終都返回函數(shù)的代碼。
對象
對象是某個特定引用類型的實例。新對象是使用new操作符后跟一個構造函數(shù)來創(chuàng)建的。
new
new運算符的作用是創(chuàng)建一個對象實例。這個對象可以是用戶自定義的,也可以是帶構造函數(shù)的一些系統(tǒng)自帶的對象。如果 new 表達式之后的構造函數(shù)返回的不是JavaScript內(nèi)置的引用對象(Object,String等)new會創(chuàng)建一個匿名對象并返回;如果是內(nèi)置引用對象或者原始類型就會覆蓋匿名對象。(無 return 時其實為 return 原始類型 undefined)
構造函數(shù)
構造函數(shù)本身就是一個函數(shù),只不過該函數(shù)是出于創(chuàng)建新對象的目的而定義的。
JavaScript中object和Object的區(qū)別
object
使用typeof檢測數(shù)據(jù)類型的時候,只要檢查的變量是一個對象,或者是null,那么它就會返回object。
Object
Object 是 JavaScript 中一個重要的對象,其它對象都是基于它的,包括你創(chuàng)建的函數(shù)。
typeof 操作符和 instanceof 操作符的區(qū)別
確定一個值是哪種基本類型可以使用 typeof操作符,而確定一個值是哪種引用類型可以使用instanceof操作符。
function和Function
ECMAScript 的Function實際上就是一個功能完整的對象。而function這個關鍵字是用來創(chuàng)建所有對象的構造函數(shù)或者使用關鍵字來定義普通函數(shù)的類和對象,var a=new function(){}實際上是用構造函數(shù)的方法創(chuàng)建了一個匿名對象的實例,而并不是系統(tǒng)內(nèi)置對象Function的實例。所以a instanceof Function返回false,typeof返回"object"。
什么時候typeof返回"function"呢?
function a (){ } //undefined typeof a //"function"
【推薦學習:javascript高級教程】