文本和属性
let user = { // 一个对象
name: "John", // 键 "name",值 "John"
age: 30 // 键 "age",值 30
};
//读取文件的属性
alert( user.name ); // John
alert( user.age ); // 30
//增加一个布尔类型
user.isAdmin = true;
// delete 操作符移除属性
delete user.age;
用多字词语来作为属性名,必须加上引号:
let user = {
name: "John",
age: 30,
"likes birds": true // 多词属性名必须加引号
};
列表中的最后一个属性以逗号结尾,便于我们添加、删除和移动属性:
let user = {
name: "John",
age: 30,
}
注意:
const 声明的对象是可以修改的
举例:
const user = {
name: "John"
};
user.name = "Pete"; // (*)
alert(user.name); // Pete
方括号
// 这将提示有语法错误
user.likes birds = true
//使用方括号
let user = {};
// 设置
user["likes birds"] = true;
// 读取
alert(user["likes birds"]); // true
// 删除
delete user["likes birds"];
通过任意表达式来获取属性名的方法
let key = "likes birds";
// 跟 user["likes birds"] = true; 一样
user[key] = true;
我们也可以根据用户的输入来获得变量 key
let user = {
name: "John",
age: 30
};
let key = prompt("What do you want to know about the user?", "name");
// 访问变量
alert( user[key] ); // John(如果输入 "name")
**注意:**点符号不能以类似的方式使用
let user = {
name: "John",
age: 30
};
let key = "name";
alert( user.key ) // undefined
计算属性
当创建一个对象时,我们可以在对象字面量中使用方括号。叫做计算属性。
let fruit = prompt("Which fruit to buy?", "apple");
let bag = {
[fruit]: 5, // 属性名是从 fruit 变量中得到的
};
alert( bag.apple ); // 5 如果 fruit="apple"
//----------------或者
let fruit = prompt("Which fruit to buy?", "apple");
let bag = {};
// 从 fruit 变量中获取值
bag[fruit] = 5;
//以及
let fruit = prompt("Which fruit to buy?", "apple");
let bag = {};
// 从 fruit 变量中获取值
bag[fruit] = 5;
属性值简写
function makeUser(name, age) {
return {
name: name,
age: age,
// ……其他的属性
};
}
let user = makeUser("John", 30);
alert(user.name); // John
我们也可以用 name 来代替 name:name
function makeUser(name, age) {
return {
name, // 与 name: name 相同
age, // 与 age: age 相同
// ...
};
}
属性名称限制
对象的属性名不受某个保留字的限制。
// 这些属性都没问题
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 (相同的属性)
属性存在性测试,“in” 操作符
JavaScript 的对象有一个需要注意的特性:能够被访问任何属性。即使属性不存在也不会报错!
读取不存在的属性只会得到 undefined
。所以我们可以很容易地判断一个属性是否存在:
let user = {};
alert( user.noSuchProperty === undefined ); // true 意思是没有这个属性
检查属性是否存在的操作符“in”
let user = { name: "John", age: 30 };
alert( "age" in user ); // true,user.age 存在
alert( "blabla" in user ); // false,user.blabla 不存在。
注意:in 的左边必须是属性名。通常是一个带引号的字符串。
let user = { age: 30 };
let key = "age";
alert( key in user ); // true,属性 "age" 存在
属性存在,存储的值是 undefined 的时候:
let obj = {
test: undefined
};
alert( obj.test ); // 显示 undefined,所以属性不存在?
alert( "test" in obj ); // true,属性存在!
for … in 循环
列出 user 所有的属性
let user = {
name: "John",
age: 30,
isAdmin: true
};
for (let key in user) {
// keys
alert( key ); // name, age, isAdmin
// 属性键的值
alert( user[key] ); // John, 30, true
}
像对象一样排序
整数属性会被进行排序,其他属性则按照创建的顺序显示。
考虑一个带有电话号码的对象:
let codes = {
"49": "Germany",
"41": "Switzerland",
"44": "Great Britain",
// ..,
"1": "USA"
};
for(let code in codes) {
alert(code); // 1, 41, 44, 49
}
整数属性
// Math.trunc 是内置的去除小数部分的方法。
alert( String(Math.trunc(Number("49"))) ); // "49",相同,整数属性
alert( String(Math.trunc(Number("+49"))) ); // "49",不同于 "+49" ⇒ 不是整数属性
alert( String(Math.trunc(Number("1.2"))) ); // "1",不同于 "1.2" ⇒ 不是整数属性
如果属性名不是整数,那么就会按照创建时的顺序来排序
let user = {
name: "John",
surname: "Smith"
};
user.age = 25; // 增加一个
// 非整数属性是按照创建的顺序来排列的
for (let prop in user) {
alert( prop ); // name, surname, age
}
可以使用非整数属性名来 欺骗 程序。给每个键名加一个 + 前缀就行了
let codes = {
"+49": "Germany",
"+41": "Switzerland",
"+44": "Great Britain",
// ..,
"+1": "USA"
};
for (let code in codes) {
alert( +code ); // 49, 41, 44, 1
}