1. 基本写法
对象是无序的数据集合,是键值对的集合。
// 两种声明语法
let obj = {'name': 'frank', 'age': 18}
let obj = new Object({'name': 'lanny'})
console.log({'name': 'lanny', 'age': 18})
对象的键名是字符串,若省略引号则只能按照标识符规则来写。极个别情况下可使用 symbol 作为属性名(ES6)。
let obj = {
1e2: '100'
}
// 不加引号,JS 会先计算出 1e2 === 100,然后把 100 变成字符串,相当于以下代码
let obj = {
100: '100'
}
let obj = {
1e-2: true
}
// 相当于
let obj = {
0.01: true
}
使用变量的值作为对象属性名需要加中括号。
let a = '123';
let obj = {
[a]: 1111
}
// 相当于以下
let obj = {
'123': 1111
}
symbol 作为属性名。
let a = Symbol();
let obj = {
[a]: 'Hello'
}
2. 隐藏属性和原型
JavaScript 中每个对象都有一个隐藏属性(通常为 __proto__),这个隐藏属性储存着共有属性组成的对象的地址,这个共有属性组成的对象叫做原型(即隐藏属性储存着原型的地址)。原型也是一个对象,所以原型也有原型。
obj = {} 的原型为所有对象的原型,这个原型含有所有对象的共有属性,是对象的根。这个原型也有原型,是 null。原型对象可以减少内存的消耗(共有属性节省内存)。
let obj = {}
obj.toString()
// 不会报错,是因为 obj 的隐藏属性 __proto__ 对应的对象(即原型)上有 toString()
3. 对象属性的增删改查
3.1 删除属性
- delete obj.name 或 dalete obj['name']:属性名和属性值都删除了
- obj.name = undefined:仅删除了属性值
3.2 查看属性
- obj['name'] 或 obj.name:查看 name 属性,
name是字符串 - 'name' in obj:判断 'name' 是否是 obj 的属性,
不区别属性是自身的还是共有的 - 'name' in obj && obj.anme === undefined:判断 obj 是否有属性 'name' 且属性值为 undefined
- obj.hasOwnProperty('toString'):判断 toString 属是自身的还是共有的
- Object.keys(obj):查看 obj 自身所有属性
- Object.values(obj):查看 obj 自身所有属性的值
- Object.entries(obj):查看 obj 自身所有属性名和属性值
let obj = {'name': 'lanny', 'age': 18}
Object.entries(obj);

- console.dir(obj):查看自身和共有属性
- obj.__proto__:查看共有属性
3.3 修改或增加属性
- obj[name] = 'lanny':报错 obj is not defined。因为 name 变量不确定。
- let key = 'name'; obj[key] = 'lanny':改为这样可以执行
- obj['na'+'me'] = 'lanny':会先计算中括号内,obj['name'] = 'lanny'
- Object.assign(obj, {'age': 18, 'gender': 'man'}):批量赋值
- Object.prototype.toString = 'xxx':改共有属性 toString
- obj.__proto__.toString = 'xxx':改共有属性 toString
- obj.__proto__ = common:改原型
所有__proto__代码都不推荐写
对象无法直接通过自身修改或增加共有属性。如 obj.toString = 'xxx' 只会在 obj 自身添加一个 toString 属性,共有属性 toString 未变化。
一般不要修改原型,会引起很多问题。如果一定要修改或增加原型上的属性,推荐采用以下方法:
let common = {kind: 'human'}
let obj = Object.create(common);
Object.assign(obj, {name: 'lanny', age: 18, gender: 'man'});
要改原型,建议一开始创建对象的时候就修改,不要后来再改。