JavaScript 对象
在本教程中,您将学习如何在 JavaScript 中创建和使用对象。
什么是对象?
JavaScript 是一种基于对象的语言,在 JavaScript 中,几乎所有的东西都是对象或行为类似于对象。 因此,为了有效和高效地使用 JavaScript,我们需要了解对象是如何工作的,以及如何创建自己的对象并使用它们。
JavaScript 对象只是命名值的集合。 这些命名值通常称为对象的属性。 如果您还记得 JavaScript 数组 一章,数组是值的集合,其中每个值都有一个从零开始并递增的索引(数字键) 每个值加一。 对象类似于数组,但不同之处在于您自己定义键,例如姓名、年龄、性别等。 在接下来的部分中,我们将详细了解对象。
创建对象
可以使用带有可选属性列表的大括号 {}
创建对象。 属性是"key: value"对,其中key(键或属性名称)始终是字符串,value(值或属性值)可以是任何数据类型 ,如字符串、数字、布尔值或复杂数据类型,如数组、函数和其他对象。 此外,以函数为值的属性通常称为方法,以将它们与其他属性区分开来。 一个典型的 JavaScript 对象可能如下所示:
var person = {
name: "Peter",
age: 28,
gender: "Male",
displayName: function() {
alert(this.name);
}
};
上面的示例创建了一个名为 person
的对象,该对象具有三个属性 name
, age
, gender
和一个方法 displayName()
。 displayName()
方法显示 this.name
的值,解析为 person.name
。 这是在 JavaScript 中创建新对象的最简单和首选的方法,称为 对象字面量 语法。
属性名称通常不需要引用,除非它们是保留字,或者如果它们包含空格或特殊字符(除了字母、数字和 _
和 $
字符),或者如果它们以数字开头,如以下示例所示:
var person = {
"first name": "Peter",
"current age": 28,
gender: "Male"
};
注意: 从 ECMAScript 5 开始,保留字可以用作对象的属性名称而无需引用。 但是,您应该避免这样做以获得更好的兼容性。
访问对象的属性
要访问或获取属性的值,您可以使用点 (.
) 或方括号 ([]
) 表示法,如下例所示:
var book = {
"name": "Harry Potter and the Goblet of Fire",
"author": "J. K. Rowling",
"year": 2000
};
// 点符号
document.write(book.author); // Prints: J. K. Rowling
// 括号符号
document.write(book["year"]); // Prints: 2000
点表示法更易于阅读和书写,但不能总是使用。 如果属性名称无效(即如果它包含空格或特殊字符),则不能使用点表示法; 您必须使用括号表示法,如以下示例所示:
var book = {
name: "Harry Potter and the Goblet of Fire",
author: "J. K. Rowling",
"publication date": "8 July 2000"
};
// 括号符号
document.write(book["publication date"]); // Prints: 8 July 2000
方括号表示法比点表示法提供了更多的灵活性。 它还允许您将属性名称指定为变量,而不仅仅是字符串文字,如下例所示:
var person = {
name: "Peter",
age: 28,
gender: "Male"
};
var key = prompt("Enter any property name to get its value");
alert(person[key]); // 输出: Peter (if enter "name")
循环遍历对象的属性
您可以使用 for...in
循环遍历对象的键值对。 此循环专门针对迭代对象的属性进行了优化。 这是一个例子:
var person = {
name: "Peter",
age: 28,
gender: "Male"
};
// 迭代对象属性
for(var i in person) {
document.write(person[i] + "<br>"); // Prints: name, age and gender
}
设置对象的属性
同样,您可以使用点 (.
) 或括号 ([]
) 表示法设置新属性或更新现有属性,如下例所示:
var person = {
name: "Peter",
age: 28,
gender: "Male"
};
// 设置新属性
person.country = "United States";
document.write(person.country); // Prints: United States
person["email"] = "peterparker@mail.com";
document.write(person.email); // Prints: peterparker@mail.com
// 更新现有属性
person.age = 30;
document.write(person.age); // Prints: 30
person["name"] = "Peter Parker";
document.write(person.name); // Prints: Peter Parker
删除对象的属性
delete
运算符可用于从对象中完全删除属性。 删除是从对象中实际删除属性的唯一方法。 将属性设置为 undefined
或 null
只会更改属性的值。 它不会从对象中删除属性。
var person = {
name: "Peter",
age: 28,
gender: "Male",
displayName: function() {
alert(this.name);
}
};
// 删除属性
delete person.age;
alert(person.age); // 输出: undefined
注意: delete
运算符仅删除对象属性或数组元素。 它对变量或声明的函数没有影响。 但是,您应该避免使用 delete
操作符来删除数组元素,因为它不会改变数组的长度,只会在数组中留下一个洞。
调用对象的方法
您可以像访问属性一样访问对象的方法——使用点表示法或方括号表示法。 这是一个例子:
var person = {
name: "Peter",
age: 28,
gender: "Male",
displayName: function() {
alert(this.name);
}
};
person.displayName(); // 输出: Peter
person["displayName"](); // 输出: Peter
按值与参考进行操作
JavaScript 对象是引用类型,这意味着当您复制它们时,您实际上只是复制了对该对象的引用。 而像字符串和数字这样的原始值是作为一个整体值分配或复制的。 为了更好地理解这一切,让我们看看下面的例子:
var message = "Hello World!";
var greet = message; // 将消息变量分配给新变量
greet = "Hi, there!";
document.write(message); // Prints: Hello World!
document.write(greet); // Prints: Hi, there!
在上面的示例中,我们复制了变量 message
并更改了该副本的值(即变量 greet
)。 这两个变量保持不同和分开。 但是,如果我们对一个对象做同样的事情,我们会得到不同的结果,如下例所示:
var person = {
name: "Peter",
age: 28,
gender: "Male"
};
var user = person; // 将人员变量分配给新变量
user.name = "Harry";
document.write(person.name); // Prints: Harry
document.write(user.name); // Prints: Harry
您可以清楚地看到,对变量 user
所做的任何更改也会更改 person
变量; 发生这种情况是因为两个变量都引用了同一个对象。 因此,简单地复制对象并不会真正克隆它,而是复制对该对象的引用。