1. 程式人生 > >JavaScript引用資料型別

JavaScript引用資料型別

JavaScript引用資料型別

引用型別

在ECMAScript中,引用型別是一種資料結構,用於將資料和功能組織在一起(它也常被稱為類)。

Object型別

建立Object例項的方式有兩種。第一種是使用new操作符後跟Object建構函式,例如;

var person = new Object();
person.name = "Nicholas";
person.age = 29;

另一種方式是使用物件字面量表示法。 例如:

var person = {
name : "Nicholas",
age ; 29
}

注意:在通過物件字面量定義物件時,實際上不會呼叫Object建構函式。

Array型別

建立陣列的基本方式有兩種。第一種是使用Array建構函式,例如:

var colors = new Array();

第二種基本方式是使用陣列字面量表示法。陣列字面量由一對包含陣列項的方括號表示,多個數組項之間以逗號隔開,例如:

var colors = ["red","blue","green"];

檢測陣列

instanceof操作符假定只有一個全域性執行環境。為了解決只個問題,ECMAScript 5新增了Array.isArray()方法。這個方法的目的是最終確定某個值到底是不是陣列,而不管它是在哪個全域性執行環境中建立的。

轉換方法

toLocalString()、toString()和valueOf()方法

所有物件都具有toLocalString()、toString()和valueOf()方法。
呼叫陣列的toString()方法會返回以逗號分隔的字串;
呼叫toLocaleString( )和toString()一樣,但是該字串與執行環境的地區對應;
呼叫valueOf()返回的還是陣列。

join()方法

join()方法只接受一個引數,即用作分隔符的字串,然後返回包含所有陣列項的字串。

棧方法(後進先出)

ECMAScript為陣列專門提供了push()和pop()方法,以便實現類似棧的行為。push()方法可以接受任意數量的引數,把他們逐個新增到陣列末尾,並返回修改後陣列的長度。pop()方法則從陣列末尾一處最後一項,減少陣列的length值,然後返回移除的項。

佇列方法(先進先出)

shift()能夠移除陣列中的第一項並返回該項,同時將陣列長度減一。結合使用shift()和push()方法,可以像使用佇列一樣使用陣列。
ECMAScript還為陣列提供了一個unshift()方法。顧名思義,unshift()與shift()的用途相反:它能在陣列前端新增任意個項並返回新陣列的長度。

重排序方法

reverse()方法會反轉陣列項的順序。
在預設情況下,sort()方法按升序排列陣列項——即最小的值位於最前面,最大的值排在最後面。為了實現排序,sort()方法會地哦啊用每個陣列項的toString()轉型方法,然後比較得到的字串,以確定如何排序。這種排序方式在很多情況下都不是最佳方案,因此sort()方法可以接收一個比較函式作為引數,以便制定哪個值位於哪個值的前面。

reverse()和sort()方法的返回值是經過排序之後的陣列

操作方法

concat()方法可以基於當前陣列中的所有項建立一個新陣列。
slice()方法能夠基於當前陣列中的一或多個項建立一個新陣列。slice()方法可以接受一或者兩個引數,即要返回項的起始和結束位置。
splice()方法主要是向陣列的中部插入值。(刪除、插入、替換)

位置方法

ECMAScript為陣列例項添加了兩個位置方法:indexOf()和lastindexOf()這兩個方法都返回要查詢的項在陣列中的位置,或者在沒有找到的情況下返回-1。這兩個方法都接受兩個引數:要查詢的項和表示查詢起點位置的索引(可選的)。

迭代方法

ECMAScript為陣列定義了五個迭代方法:

every():對陣列中的每一項執行給定函式,如果該函式對每一項都返回 true,則返回 true。
filter():對陣列中的每一項執行給定函式,返回該函式會返回 true 的項組成的陣列。
forEach():對陣列中的每一項執行給定函式。這個方法沒有返回值。
map():對陣列中的每一項執行給定函式,返回每次函式呼叫的結果組成的陣列。
some():對陣列中的每一項執行給定函式,如果該函式對任一項返回 true,則返回 true。

歸併方法

ECMAScript 5 還新增了兩個歸併陣列的方法:reduce()和 reduceRight()。這兩個方法都會迭代陣列的所有項,然後構建一個最終返回的值。
使用 reduce()和reduceRight()方法可以執行求陣列中所有值之和的操作,比如:
var values = [1,2,3,4,5];
var sum = values.reduce(function(prev, cur, index, array){
return prev + cur;
});
alert(sum); //15

Date型別

建立日期物件,使用new操作符和Date建構函式即可:
var now = new Date();
在呼叫Date建構函式而不傳遞引數的情況下,新建立的物件自動獲得當前日期和時間。 為了可以接受表示日期的字串引數,ECMAScript提供了兩個方法:Date.parse()和Date.UTC()。
ECMAScript添加了Date.now()方法,返回表示呼叫這個方法時的日期和時間的毫秒數。

繼承的方法

Date型別也重寫了toLocalString()、toString()和valueOf()方法。
toLocalString()方法會按照與瀏覽器相適應的格式返回日期與時間,而toString()方法則通常返回帶有時區資訊的日期和時間。至於valueOf()方法,則根本不返回字串,而是返回日期的毫秒錶示。

Function型別

函式實際上是物件,函式名實際上也是一個指向函式物件的指標,不會與某個函式繫結。每個函式都是Function型別的例項,而且都與其他引用型別一樣具有屬性和方法。
函式通常是使用函式宣告語法定義的:(函式宣告提升)

function sum (sum1,sum2) {
return sum1 + sum2;
}

還有一種方式,使用函式表示式定義函式:

var sum = function(sum1,sum2) {
return sum1 +sum2 ;
};
注意:要訪問函式指標而不執行函式的話,必須去掉函式名後面的圓括號。

函式內部屬性

在函式內部,有兩個特殊的物件:arguments和this。arguments是一個類陣列物件,包含著傳入函式中的所有引數。該物件有一個屬性,該屬性有一個指標,指向擁有這個arguments物件的函式。this引用的是函資料以執行的環境物件。(當在網頁的全域性作用域中呼叫函式時,this物件引用的就是window)

函式屬性和方法

屬性

每個函式都包含兩個屬性:length和prototype。
length屬性表示函式希望接收的命名引數的個數。
對於ECMAScript中的引用型別而言,prototype是儲存它們所有例項方法的真正所在。prototype屬性是不可列舉的,所以使用for-in無效。

方法

每個函式都包含兩個非繼承而來的方法:apply()和call()
這兩個方法的用途都是在特定的作用域中呼叫函式,實際上等於設定函式體內this物件的值。作用例項:1.傳遞引數 2.擴充函式賴以執行的作用域
EAMAScript還定義了一個方法:bind()
這個方法會建立一個函式的例項,其this值會被繫結到傳給bind()函式的值

物件

物件是某個特定引用型別的例項。新物件是使用new操作符後跟一個建構函式來建立的。

new

new運算子的作用是建立一個物件例項。這個物件可以是使用者自定義的,也可以是帶建構函式的一些系統自帶的物件。如果 new 表示式之後的建構函式返回的不是JavaScript內建的引用物件(Object,String等)new會建立一個匿名物件並返回;如果是內建引用物件或者原始型別就會覆蓋匿名物件。(無 return 時其實為 return 原始型別 undefined)

建構函式

建構函式本身就是一個函式,只不過該函式是出於建立新物件的目的而定義的。

JavaScript中object和Object的區別

object

使用typeof檢測資料型別的時候,只要檢查的變數是一個物件,或者是null,那麼它就會返回object。

Object

Object 是 JavaScript 中一個重要的物件,其它物件都是基於它的,包括你建立的函式。

typeof 操作符和 instanceof 操作符的區別

確定一個值是哪種基本型別可以使用 typeof操作符,而確定一個值是哪種引用型別可以使用instanceof操作符。

function和Function

ECMAScript 的Function實際上就是一個功能完整的物件。而function這個關鍵字是用來建立所有物件的建構函式或者使用關鍵字來定義普通函式的類和物件,var a=new function(){}實際上是用建構函式的方法建立了一個匿名物件的例項,而並不是系統內建物件Function的例項。所以a instanceof Function返回false,typeof返回"object"。

什麼時候typeof返回"function"呢?

function a (){ }
//undefined
typeof a
//"function"