Object(对象):基础知识
对象用来存储键值对和更复杂的实体。
对象
JavaScript 中有八种数据类型。有七种原始类型,因为它们的值只包含一种东西(字符串,数字或者其他)。相反,对象则用来存储键值对和更复杂的实体。
基础操作
创建
// 创建空对象
let user = new Object(); // “构造函数” 的语法
let user = {}; // “字面量” 的语法(常用)
初始化
列表中的最后一个属性应以逗号结尾,这叫做尾随(trailing)或悬挂(hanging)逗号。这样便于我们添加、删除和移动属性,因为所有的行都是相似的。
let user = { // 一个对象
name: "John", // 键 "name",值 "John"
age: 30, // 键 "age",值 30
"likes birds": true, // 多词属性名必须加引号
};
添加属性
// 添加属性,属性的值可以是任意类型
// 使用点操作添加属性、属性值
user.isAdmin = true;
// 使用方括号操作添加属性、属性值
user["likes birds"] = true;
读取
// 读取文件的属性
// 点操作读取
alert( user.name ); // John
// 方括号读取
alert(user["likes birds"]); // true
方括号提供了一种可以通过任意表达式来获取属性名的方式:
let user = {
name: "John",
age: 30
};
let key = prompt("What do you want to know about the user?", "name");
// 访问 变量
alert( user[key] ); // John(如果输入 "name")
移除属性
delete user.age;
delete user["likes birds"];
计算属性
当创建一个对象时,我们可以在对象字面量中使用方括号。这叫做 计算属性。
let fruit = prompt("Which fruit to buy?", "apple");
let bag = {
[fruit]: 5, // 属性名是从 fruit 变量中得到的
};
alert( bag.apple ); // 5 如果 fruit="apple"
所以,如果一个用户输入 "apple",bag 将变为 {apple: 5}
。
方括号比点符号更强大。它允许任何属性名和变量,但写起来也更加麻烦。
所以,大部分时间里,当属性名是已知且简单的时候,就使用点符号。如果我们需要一些更复杂的内容,那么就用方括号。
属性值简写
在实际开发中,我们通常用已存在的变量当做属性名、将其值作为属性值。 即:通过变量生成属性。
function makeUser(name, age) {
return {
name: name,
age: age,
// ……其他的属性
};
}
// 进一步简写
let user = {
name, // 与 name:name 相同
age: 30
};
属性名称限制
变量名不能是编程语言的某个保留字,如 “for”、“let”、“return” 等…… 但对象的属性名并不受此限制。
// 这些属性都没问题
let obj = {
for: 1,
let: 2,
return: 3
};
alert( obj.for + obj.let + obj.return ); // 6
简而言之,属性命名没有限制。属性名可以是任何字符串或者 symbol(一种特殊的标志符类型)。
其他类型会被自动地转换为字符串。
例如,当数字 0 被用作对象的属性的键时,会被转换为字符串 "0":
let obj = {
0: "test" // 等同于 "0": "test"
};
// 都会输出相同的属性(数字 0 被转为字符串 "0")
alert( obj["0"] ); // test
alert( obj[0] ); // test (相同的属性)
这里有个小陷阱:一个名为 proto 的属性。我们不能将它设置为一个非对象的值:
let obj = {};
obj.__proto__ = 5; // 分配一个数字
alert(obj.__proto__); // [object Object]
—— 值为对象,与预期结果不同 我们从代码中可以看出来,把它赋值为 5 的操作被忽略了。 我们将在 后续章节 中学习 proto 的特殊性质,并给出了解决此问题的方法。
属性存在性测试
相比于其他语言,JavaScript 的对象有一个需要注意的特性:能够被访问任何属性。即使属性不存在也不会报错,读取不存在的属性只会得到 undefined。
判断一个属性是否存在:
let user = {};
alert( user.noSuchProperty === undefined ); // true 意思是没有这个属性
这里还有一个特别的,检查属性是否存在的操作符 "in"。
let user = { age: 30 };
let key = "age";
alert( key in user ); // true,属性 "age" 存在
alert( "name" in user ); // false,属性 "name" 不存在