第 5 章 引 用 類 型
引用類型是一種數據結構,引用類型有時候也被稱爲對象定義,因爲它們描述的是一類對象所具有的屬性和方法。
5.1 Object 類型
創建 Object 實例的方式有兩種。第一種是使用 new 操作符後跟 Object 構造函數,如下所示:
var person = new Object();
person.name = "Nicholas";
person.age = 29;
另一種方式是使用對象字面量表示法。
在 age 屬性的值 29 的後面不能添加逗號,會在 IE7 及更早版本和Opera 中導致錯誤。
var person = {
name : "Nicholas",
age : 29
};
在使用對象字面量語法時,屬性名也可以使用字符串,如下面這個例子所示:
這裏的數值屬性名會自動轉換爲字符串。
var person = {
"name" : "Nicholas",
"age" : 29,
5 : true
};
使用對象字面量語法時,如果留空其花括號,則可以定義只包含默認屬性和方法的對象,如下所示:
var person = {}; //與 new Object()相同
person.name = "Nicholas";
person.age = 29;
對象字面量也是向函數傳遞大量可選參數的首選方式,例如:
function displayInfo(args) {
var output = "";
if(typeof args.name == "string") {
output += "Name: " + args.name + "\n";
}
if(typeof args.age == "number") {
output += "Age: " + args.age + "\n";
}
alert(output);
}
displayInfo({
name: "Nicholas",
age: 29
});
displayInfo({
name: "Greg"
});
在 JavaScript 也可以使用方括號表示法來訪問對象的屬性。在使用方括號語法時,應該將要訪問的屬性以字符串的形式放在方括號中,如下面的例子所示。
alert(person["name"]); //"Nicholas"
alert(person.name); //"Nicholas"
方括號語法的主要優點是可以通過變量來訪問屬性,例如:
var propertyName = "name";
alert(person[propertyName]); //"Nicholas"
屬性名中包含會導致語法錯誤的字符,或者屬性名使用的是關鍵字或保留字,也可以使用方括號表示法。例如:
person["first name"] = "Nicholas";
屬性名中是可以包含非字母非數字的,這時候就可以使用方括號表示法來訪問它們。通常,除非必須使用變量來訪問屬性,否則我們建議使用點表示法。
5.2 Array 類型
創建數組的基本方式有兩種。第一種是使用 Array 構造函數
var colors = new Array();
給構造函數傳遞該數量,而該數量會自動變成 length屬性的值。
var colors = new Array(20);
也可以向 Array 構造函數傳遞數組中應該包含的項。以下代碼創建了一個包含 3 個字符串值的數組:
var colors = new Array("red", "blue", "green");
給構造函數傳遞一個值也可以創建數組,因爲如果傳遞的是數
值,則會按照該數值創建包含給定項數的數組;而如果傳遞的是其他類型的參數,則會創建包含那個值的只有一項的數組。
var colors = new Array(3); // 創建一個包含 3 項的數組
var names = new Array("Greg"); // 創建一個包含 1 項,即字符串"Greg"的數組
注:在使用 Array 構造函數時也可以省略 new 操作符
創建數組的第二種基本方式是使用數組字面量表示法。
var colors = ["red", "blue", "green"]; // 創建一個包含 3 個字符串的數組
var names = []; // 創建一個空數組
var values = [1,2,]; // 不要這樣!這樣會創建一個包含 2 或 3 項的數組
var options = [,,,,,]; // 不要這樣!這樣會創建一個包含 5 或 6 項的數組
在讀取和設置數組的值時,要使用方括號並提供相應值的基於 0 的數字索引
var colors = ["red", "blue", "green"]; // 定義一個字符串數組
alert(colors[0]); // 顯示第一項
colors[2] = "black"; // 修改第三項
colors[3] = "brown"; // 新增第四項
數組的項數保存在其 length 屬性中,這個屬性始終會返回 0 或更大的值
數組的 length 屬性很有特點——它不是隻讀的。因此,通過設置這個屬性,可以從數組的末尾移除項或向數組中添加新項。
這個例子中的數組 colors 一開始有 3 個值。將其 length 屬性設置爲 2 會移除最後一項(位置爲2 的那一項),結果再訪問
colors[2]就會顯示 undefined 了。
如果將其 length 屬性設置爲大於數組項數的值,則新增的每一項都會取得 undefined 值,如下所示:
在此,雖然 colors 數組包含 3 個項,但把它的 length 屬性設置成了 4。這個數組不存在位置 3,所以訪問這個位置的值就得到了特殊值 undefined。
利用 length 屬性也可以方便地在數組末尾添加新項,如下所示:
5.2.1 檢測數組
5.2.2 轉換方法
所有對象都具有 toLocaleString()、toString()和 valueOf()方法
var colors = ["red", "blue", "green"]; // 創建一個包含 3 個字符串的數組
alert(colors.toString()); // red,blue,green
alert(colors.valueOf()); // red,blue,green
alert(colors); // red,blue,green
數組繼承的 toLocaleString()、toString()和 valueOf()方法,在默認情況下都會以逗號分隔的字符串的形式返回數組項。
join()方法只接收一個參數,即用作分隔符的字符串,然後返回包含所有數組項的字符串。
法只接收一個參數,即用作分隔符的字符串,然後返回包含所有數組項的字符串。請看下面的例子:
var colors = ["red", "green", "blue"];
alert(colors.join(",")); //red,green,blue
alert(colors.join("||")); //red||green||blue
5.2.3 棧方法