理解对象

对象底层属性

  • 早期创建按对象的方式 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
      • 当设置了configurabletrue, 表示不可配置该属性,之后就不能设置 configurabletrue

[[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() 就是对源对象执行的是浅复制

对象标识及相等判断

=== 符号的缺陷

  1. // === 符合的预期情况
  2. true === 1 // false
  3. {} === {} // false
  4. "2" === 2 // false
  5. // === 特殊情况
  6. +0 === -0 // true
  7. +0 === 0 // true
  8. -0 === 0 // true
  9. NaN === NaN // false
  10. 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

  1. <a name="sg9rM"></a>
  2. ### 增强的对象语法
  3. - 对象属性的简写, 当属性名和变量名相同时,对象属性可以简写;
  4. - 使用`[]` 方式添加属性,和访问对象属性
  5. - 对象简化方法名 `let person = { sayName() {}}`
  6. <a name="ubhpF"></a>
  7. ### 对象的解构
  8. ```javascript
  9. let person = {
  10. name: "Matt",
  11. age: 123
  12. }
  13. let {name, age} = person
  14. // 如果解构没有的值, 得到的值 为 undefine
  15. // 设置解构的默认值
  16. let {name, age = 456} = person