一、对象的语法
- 定义:①无序的数据集合 ②键值对的集合
- 声明对象的方法:
- let obj = {'name':'xxx','age':18} (常用简写方法)
- let obj = new Object({'name':'xxx'}) (标准语法)
- console.log({'name':'xxx','age':18}) (这个不是声明方法,只是可以这样获取)
- 注意细节:属性名永远是字符串。不是标识符,可以包含任意字符;
二、属性名和属性值
1、特殊的属性名
let obj = {
1:'a',
3.2:'b',
1e2:true, //先把1e2变成数字100,再把数字100变成字符串100作为属性名
1e-2:true, //同上
.234:true, // 0.234
0xff:true //把16进制变成10进制,再变成字符串
}
- 变量做属性名 用[ ]把变量括起来
let p1 = 'name';
let obj = {p1:'xxx'}; //属性名是'p1',常量
let obj = {[p1]:'xxx'} //属性名是'name',变量
三、查看对象的属性
- 查看自身属性
- 属性名:Object.keys(obj)
- 属性值:Object.values(obj)
- 属性名和属性值:Object.entries(obj)
- 查看自身属性和共有属性
- console.dir(obj) //dir是以目录的形式打印出来
- 依次用Object.keys打印出__proto__
- 判断一个属性是自身的还是共有的
- obj.hasOwnProperty('toString')
- 'name' in obj和obj.hasOwnProperty('name') 的区别:
- 'name' in obj 既可以查看自身属性,也能查看共有属性(toString等)
- obj.hasOwnProperty('name') 只能查看自身属性
- 查看属性
- 中括号语法:obj['key'] // 优先使用
- 点语法:obj.key //不加单引号,这里的key等同于字符串'key'
- 有坑的语法:obj[key] //这里不加单引号,表示key是个变量;
四、删属性
- 语法:
- delete obj.xxx 或delete obj.['xxx'] 会把属性名和属性值一起删掉
- obj.xxx = undefined 只删掉属性值
- 注意
- 不含属性名:'xxx' in obj === false
- 含属性名,但是值为undefined:'xxx' in obj && obj.xxx === undefined
- obj.xxx === undefined 不能断定xxx是不是obj的属性(可以是有xxx属性,但是值是undefined)
五、修改和增加对象的属性
- 直接赋值
let obj = {name: 'xxx'} // name 是字符串
obj.name = 'xxx' // name 是字符串
obj['name'] = 'xxx'
obj[name] = 'xxx' // 错,因 name 值不确定
obj['na'+'me'] = 'xxx'
let key = 'name'; obj[key] = 'xxx'
let key = 'name'; obj.key = 'xxx' // 错;因为 obj.key 等价于 obj['key']
-
批量赋值 Object.assign(obj.{age:18,gender:'man'}
-
修改或增加共有属性
- 无法通过自身修改或增加共有属性
- 偏要修改(不要修改)
obj.__proto__.toString = 'xxx' // 不推荐用 __proto__
Object.prototype.toString = 'xxx
- 修改隐藏属性
- __ proto___
- Object.create(指定原型,这个方法的属性在原型上)
let obj = Object.create(common)
obj.name = 'frank'
let obj2 = Object.create(common)
obj2.name = 'jack'
六、原型
- 每个对象都有原型
- 对象的原型也是对象
- 所有对象的原型也有原型
- obj = {} 的原型即为所有对象的原型
- 这个原型包含所有对象的共有属性,是对象的根
- 这个原型也有原型,是 null