JS对象
无序的数据集合
键值对的集合
声明对象的两种语法
let obj = { 'name' : 'kfc', 'age': 18} //简略写法
let obj = new Object{ 'name' : 'kfc', 'age': 18} //规范写法
console.log({ 'name' : 'kfc', 'age': 18}) //该语句创建的对象没有名字
细节
- 键名是字符串不是标识符,可以包含任意字符
- 引号可以省略,省略之后就只能写标识符
- 就算是引号省略了键名还是字符串
属性名
每个key都是对象的属性名
属性值
每个value都是对象的属性值
属性名加[]可实现变量作属性名,如:
let obj = { [name] : 'kfc', 'age': 18}
如何删除对象的属性
语法
delete obj.xxx 或 delete obj['xxx']
请区分「属性值为 undefined」和「不含属性名」
细节
- 判断对象中还有没有某个属性名
'xxx' in obj === false
- 含有属性名,但是值为 undefined
'xxx' in obj && obj.xxx === undefined
- 注意
obj.xxx === undefined不能断定 'xxx' 是否为 obj 的属性
如何查看对象的属性
- 查看自身所有属性:
Object.keys(obj) - 查看自身+共有属性:
console.dir(obj)
或者
用Object.keys打印出obj._ _ proto_ _
-
如何判断一个属性是自身的还是共有的
obj.hasOwnProperty('XXX') -
两种方法查看属性
1 中括号语法obj['key']
2 点语法obj.key
3 坑新人语法:obj[key] // 变量 key 值一般不为 'key
- 请优先使用中括号语法
点语法会误导你,让你以为 key 不是字符串 等你确定不会弄混两种语法,再改用点语法
如何修改或增加对象的属性
修改自身的属性
- 改单个属性的属性值
let obj = {name: 'whatever'} // name是字符串
或者
obj.name = 'whatever'// name是字符串
或者
obj['name'] = 'whatever'
或者
obj['na'+'me'] = 'whatever'
- 批量修改属性的属性值
Object.assign(obj,{'age':18,...})
- 修改共有属性
无法通过自身修改或增加共有属性
let obj = {}, obj2 = {} // 共有 toString
obj.toString = 'xxx' 只会在改 obj 自身属性
obj2.toString 还是在原型上
- 修改隐藏属性
let obj = Object.create(common)
let common = {hairColor: 'black', country: '中国'};
let obj = Object.create(common);
obj.name = '小红';
let obj2 = Object.create(common);
obj2.name = '小王';
Object.assign(obj2, {age: 15, city: '广州'});
console.log(obj.country); // "中国"
console.log(obj2.country); // "中国"
## 'name' in obj和obj.hasOwnProperty('name') 的区别
* `'name' in obj`查看属性`name`是否在`obj`里。
* `obj.hasOwnProperty('name')`用来检测`obj`是否含有特定的自身属性`name`。
这个方法会查找一个对象是否有某个属性,但是不会去查找它的原型链。