对象
概述
对象(object)是 JavaScript 的核心概念,是一组键值对的无序集合。
js
var obj = {
foo: 'Hello',
bar: 'World'
};对象中的每个成员都由键名和键值组成,键名与键值用冒号分隔,成员之间用逗号分隔。
键名规则
对象的键名都是字符串(ES6 后 Symbol 也可作为键名)。如果键名是数值,会被自动转为字符串:
js
var obj = {
1: 'a',
3.2: 'b'
};
obj['1']; // "a"不符合标识名规则的键名必须加引号:
js
var obj = {
'1p': 'Hello World',
'h w': 'Hello World'
};属性和方法
对象的键值可以是任意数据类型,如果值是函数,则称为方法:
js
var obj = {
p: function (x) {
return 2 * x;
}
};
obj.p(1); // 2对象引用
多个变量指向同一对象时,它们都是该对象的引用:
js
var o1 = {};
var o2 = o1;
o1.a = 1;
o2.a; // 1对象属性可以动态创建:
js
var obj = {};
obj.foo = 123;
obj.foo; // 123对象字面量歧义
以大括号开头的语句可能被解释为代码块,为避免歧义,可在对象外加圆括号:
js
({ foo: 123 }) // 正确属性操作
读取属性
使用点运算符或方括号运算符读取属性:
js
var obj = { p: 'Hello World' };
obj.p; // "Hello World"
obj['p']; // "Hello World"方括号内可使用变量或表达式:
js
var key = 'p';
obj[key]; // "Hello World"
obj['hello' + ' world'];
obj[3 + 3];数值键名只能用方括号访问:
js
var obj = { 123: 'hello world' };
obj[123]; // "hello world"设置属性
可随时为对象添加新属性:
js
var obj = {};
obj.foo = 'Hello';
obj['bar'] = 'World';查看属性
使用 Object.keys 查看对象的所有属性:
js
var obj = { key1: 1, key2: 2 };
Object.keys(obj); // ['key1', 'key2']删除属性
使用 delete 命令删除属性:
js
var obj = { p: 1 };
delete obj.p; // true
obj.p; // undefined检查属性
使用 in 运算符检查属性是否存在:
js
var obj = { p: 1 };
'p' in obj; // true
'toString' in obj; // true(继承的属性)使用 hasOwnProperty 方法区分自身属性和继承属性:
js
var obj = {};
obj.hasOwnProperty('toString'); // false遍历属性
使用 for...in 循环遍历对象属性:
js
var obj = { a: 1, b: 2 };
for (var i in obj) {
console.log('键名:', i);
console.log('键值:', obj[i]);
}为只遍历对象自身属性,应结合使用 hasOwnProperty 方法:
js
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
console.log(key);
}
}with 语句
with 语句用于简化对同一对象多个属性的操作:
js
var obj = { p1: 1, p2: 2 };
// 使用 with
with (obj) {
p1 = 4;
p2 = 5;
}
// 等同于
obj.p1 = 4;
obj.p2 = 5;但由于作用域不明确,不建议使用 with 语句,可用临时变量替代:
js
// 不推荐
with (obj1.obj2.obj3) {
console.log(p1 + p2);
}
// 推荐
var temp = obj1.obj2.obj3;
console.log(temp.p1 + temp.p2);