第 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 栈方法