理解对象
对象底层属性
- 早期创建按对象的方式
let person = new Object()
, 再往person
中添加属性和方法, 现在都是直接let person = {xx: xxx}
- 对象的底层
- 每个对象都具有底层的属性 -> 数据属性、 访问器属性
- 数据的属性:[[Configurable]] [[Enumerable]] [[Writable]] [[Value]]
- 访问器属性: [[Get]] [[Set]]
- 使用
Object.defineProperty()
设置 设置以上的这几个值 Object.defineProperty("设置的对象", "需要设置的属性值", "{设置配置项}")
- 访问属性 [[Get]] [[Set]]
- vue2 的底层数据劫持就是用了这个
- 同样使用
Object.defineProperty()
设置- get() 方法返回读取的属性值
- set(newVal) 修改对应的属性值
- 注意点:
- for-in 循环对象得到的是 对象的 key
- 当设置了
configurable
为true
, 表示不可配置该属性,之后就不能设置configurable
为true
了
[[Configurable]] : 可配置,是否可以删除 delete 某个属性
[[Enumerable]] : 配置 某个属性是否可以使用 for-in 循环
[[Writable]] : 配置 某个数据值 是否可以被修改
[[Value]] : 设置 属性值 默认为 undefined
定义多个对象
- 书中提供了
Object.defineProperties(指定对象, {设置的多个属性})
这个API 定义对象的 多个属性值 - 用法 - 用到去百度
读取属性的特性
- 提供了
Object.getOwnPropertyDescriptor(指定的对象,需要查看的属性)
这个API 来读取对象的某一个属性的底层, 返回值是一个对象, 通过这个对象查看配置 用法省略
还有一个
Object.getOwnPropertyDescriptors(指定对象)
查看所有属性的配置- 用法
console.log(Object.getOwnPropertyDescriptors(指定对象))
合并对象
- 合并对象用的是
Object.assign(指定对象,需要合并的对象)
这个API, 如果需要合并多个对象, 就在后面加上参数 - 注意事项
Object.assign()
返回一个对象,就是合并后的对象Object.assign()
会修改执行对象,而且这个执行对象 就等于Object.assign()
的返回值Object.assign()
合并对象中, 对象具有相同的属性名, 则 后面的对象属性 会覆盖前面的属性- 浅复制: 就是意味着 只会复制对象的引用(复制对象的地址值),
Object.assign()
就是对源对象执行的是浅复制
对象标识及相等判断
===
符号的缺陷
// === 符合的预期情况
true === 1 // false
{} === {} // false
"2" === 2 // false
// === 特殊情况
+0 === -0 // true
+0 === 0 // true
-0 === 0 // true
NaN === NaN // false
isNaN(NaN) // true
- 在ES6 提供了这个API 用于判断数据类型
Object.is()
, 这个方法和===
很像 Object.is()
的用法 ```javascript Object.is(true, 1) // false Object.is({}, {}) // false Object.is(“2”, 2) // false
// 正确的判定 +0 -0 0 Object.is(+0, -0) // false Object.is(+0, 0) // true Object.is(-0, 0) // false
// 记住 NaN 相等的方法 Object.is(NaN, NaN) // true
<a name="sg9rM"></a>
### 增强的对象语法
- 对象属性的简写, 当属性名和变量名相同时,对象属性可以简写;
- 使用`[]` 方式添加属性,和访问对象属性
- 对象简化方法名 `let person = { sayName() {}}`
<a name="ubhpF"></a>
### 对象的解构
```javascript
let person = {
name: "Matt",
age: 123
}
let {name, age} = person
// 如果解构没有的值, 得到的值 为 undefine
// 设置解构的默认值
let {name, age = 456} = person