声明对象的两种语法
let obj = {'name': 'frank', 'age': 18}
let obj = new Object({'name': 'frank'})
- 键名是字符串,不是标识符,可以包含任意字符
- 引号可省略,省略之后就只能写标识符
-
一些特殊的属性名
let obj = {
1:'a',
2.6:'b',
1e2:'c',
.234:true,
0XFF:true
}
//属性名都会自动变成字符串
Object.keys(obj)
//得到所有属性名, ["1", "2.6","100", "0.234", "255"]
查看属性两种方法
中括号语法: obj[‘key’]
- 点语法: obj.key, key认为是字符串
-
使用变量做属性名
let p1 = 'name'
let obj = {p1:'mark'}; 属性名是字符串, 'p1';
let obj1 = {[p1]:'frank'}; 属性名是变量,变量值是 'name';
不加 [] 的属性名会自动变成字符串
- 加了 [] 则会当成变量求值
删除对象的属性
let obj = {'name': 'frank', 'age': 18}
delete obj.name
delete obj['age']
- obj.name 中的name是字符串,新手推荐第二种写法:delete obj[‘name’]
查看对象的属性
let obj = {'name': 'frank', 'age': 18}
Object.keys(obj) //查看自身属性名
Object.values(obj) //查看自身属性值
Object.entries(obj) //查看自身键值对
console.dir(obj) //查看自身+原型属性
obj.__proto__ //查看原型属性,不推荐
obj.hasOwnProperty('xxx') //判断一个属性是自己的还是原型的
'xxx' in obj === false //判断对象是否包含属性名
'xxx' in obj && obj.xxx === undefined //判断对象的一个属性是否存在并且属性值为undefined
obj.xxx === undefined //不能断定'xxx'是否为obj的属性值
修改或增加对象的属性
直接赋值
let obj = {name: 'frank'} //name是字符串
obj.name = 'frank' //name是字符串
obj['name'] = 'frank' //name是字符串
obj[name] = 'frank' //错,因name值不确定
obj['na' + 'me'] = 'frank'
let key = 'name'; obj[key] = 'frank';
let key = 'name'; obj.key = 'frank'; //错,这里的key是指字符串'key'
批量赋值
Object.assign(obj, {p1:1, p2:2, p3:3}
修改或增加共有属性
无法通过自身修改或增加共有属性
let obj = {}, obj2 = {}
obj.toString = "xxx" //只会在改obj自身属性
obj2.toString //还是在原型上
修改或增加原型的属性
obj.__proto__.toString = 'xxx' //不推荐用__proto__
Object.prototype.toString = 'xxx'
// 一般来说,不要修改原型,会引起很多问题
推荐使用Object.create()
let obj = Object.create(common)
obj.name = 'frank'
let obj2 = Object.create(common)
obj2.name = 'jack'
//要改就一开改,别后来再改
//增加的common原型会添加到原来的原型链中
‘name’ in obj 和 obj.hasOwnProperty(‘name’) 的区别
- in检测对象里的全部属性, 也就是包括了原型属性, 而hasOwnProperty只包含检测对象里的属性, 不包含原型属性。
let obj = {};
'toString' in obj //true
obj.hasOwnProperty('toString') //false