一、声明对象的两种语法
1. let obj = { 'name': 'frank', 'age': 18 };
2. let obj = new Object({'name': 'frank'});
注:
- 键名是字符串,不是标识符,可以包含任意字符
- 引号可省略,省略之后就只能写标识符
- 就算引号省略了,键名也还是字符串(重要)
二、如何删除对象的属性
1. delete obj.xxx;
2. delete obj['xxx'];
需要注意的是,以上两种方式可以删除属性,但删除的是属性名,非属性值,例:
let person = { 'name': 'frank', 'age': 18 };
delete person.name;
console.log(person); /*打印结果:penson = {'age':18}*/
打印结果已经没有了'name'属性,使用delete person['name']会得到同样的效果,但是如果使用以下写法:
let person = { 'name': 'frank', 'age': 18 };
person.name = undefined;
console.log(person); /*打印结果:penson = {'name':undefined,'age':18}*/
打印结果'name'属性名仍然存在,只是'name'属性的值变为了undefined,同理,使用person['name']=undefined会得到同样的效果;
三、如何查看对象的属性
1. 查看所有属性
- 查看自身所有属性
Object.keys(obj)
- 查看自身+共有属性
console.dir(obj)
- 判断一个属性是自身的还是共有的
obj.hasOwnProperty('toString')
2. 查看某个属性
- 中括号语法:
obj['key'] - 点语法:
obj.key
注:obj.name 等价于 obj['name']
,但是 obj.name 不等价于 obj[name];
简单来说,这里的 name 是字符串,而不是变量;
另外还有一个点需要注意,当name为变量而非字符串时:
let name = 'frank';
obj[name] 等价于obj['frank'], 而不是
obj['name'] 和 obj.name
四、如何修改或增加对象的属性
- 改自身
obj['name'] = 'jack' - 批量改自身
Object.assign(obj, {age:18, ...}) - 改共有属性
obj.__proto__['toString'] = 'xxx' - 改共有属性
Object.prototype['toString'] = 'xxx' - 改原型
obj.__proto__ = common - 改原型
let obj = Object.create(common)
注:所有 proto 代码都是强烈不推荐写的;
增加属性基本同上:已有属性则改;没有属性则增。
五、'name' in obj和obj.hasOwnProperty('name') 的区别
'name' in obj :
查看某个对象是否含有name属性,但无法区分name属性是本身的还是共有的;
obj.hasOwnProperty('name')
查看某个对象自身是否含有name属性,而非共有属性;