理解对象
对象底层属性
- 早期创建按对象的方式
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 // trueNaN === NaN // falseisNaN(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>### 对象的解构```javascriptlet person = {name: "Matt",age: 123}let {name, age} = person// 如果解构没有的值, 得到的值 为 undefine// 设置解构的默认值let {name, age = 456} = person
