- javascript中对象的表现形式类似于python中的字典,以键值对的形式存储在花括号中,例如
let user = { // 一个对象
name: "John", // 键 "name",值 "John"
age: 30 // 键 "age",值 30
};
- 属性值可以是任意类型,可以使用点表达式访问属性值 ,用delete操作符删除属性,例如
alert( user.age );
delete user.age;
- 列表中的最后一个属性应以逗号结尾,以便于添加、删除和移动属性:
let user = {
name: "John",
age: 30,
}
- 对对象的操作同样可以用类似python字典的方括号
let user = {}; // 设置 user["likes birds"] = true; // 读取 alert(user["likes birds"]); // true // 删除 delete user["likes birds"];
不同之处在于,方括号会先evaluate其内部的值,而点表达式不会:
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 key = "name"; alert( user.key ) // undefined
再比如:
let fruit = 'apple'; let bag = { [fruit + 'Computers']: 5 // bag.appleComputers = 5 };
这里应用的是js中用加号进行字符串拼接的操作
-
实际开发中,我们通常用已存在的变量当做属性名,因此可以这样缩写
function makeUser(name, age) { return { name, // 与 name: name 相同 age, // 与 age: age 相同 // ... }; }
属性名简写方式也可以和正常方式混用,比如把上面的age改为age:30。
-
属性名称与变量名称不同,几乎没有限制,可以是任何字符串或者 symbol,其他类型会被自动地转换为字符串。
- javascript中即使属性不存在也不会报错,读取不存在的属性只会得到
undefined
。也可以用in
检查属性是否存在(可以用来应对属性值本身是undefined的情况)
let user = { age: 30 };
let key = "age";
alert( key in user ); // true,属性 "age" 存在
- 为了遍历一个对象的所有键(key)可以使用一个特殊形式的循环:
for..in,
同python类似,格式为for (key in object) { // 对此对象属性中的每个键执行的代码 }
例如,
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 }
这里的key也可用其他名称代替
-
遍历一个对象时属性的排序:整数键(像 "1", "41" 这样纯数字的键,+10和1.2这种不算)会按照升序排序,无论你写入对象的顺序如何;非整数键(如 "name", "hello")会按照插入顺序保留;混合键:整数键先排序,非整数键按插入顺序排列。
let codes = { "49": "Germany", "41": "Switzerland", "44": "Great Britain", // .., "1": "USA" }; for(let code in codes) { alert(code); // 1, 41, 44, 49 }
let codes = { "+49": "Germany", "+41": "Switzerland", "+44": "Great Britain", // .., "+1": "USA" }; for (let code in codes) { alert( +code ); // 49, 41, 44, 1 }
想保留严格排序可以用map代替object