tt-up / fed-in-depth

经验、知识、笔记——让坚持学习成为一种习惯
6 stars 1 forks source link

【红宝书第4版读书笔记】06-集合引用类型 #15

Open yuqingc opened 4 years ago

yuqingc commented 4 years ago

06 集合引用类型

Object 类型

Array 类型

数组空洞(Array Holes)

let arr = [,,,,]

ES6 之后新增的语法,空的项目视为 undefined。但是有 ES6 方法会忽略这些项,比如 map

for (const option of options) {
  alert(option === undefined);
}
// false
// true
// true
// true
// false

// for in 因为是 ES6 之前的语法,所以啥都不会输出
for (const index in options) {
  console.log(index);
}

const options = [1,,,,5]
alert(options.map(() => 6)); // 6,,,,6

为了避免被同事骂,请勿使用此类骚操作,如果一定要空,请显式赋值 undefined

判断是否是数组

填充数组的两个方法

Typed Array

JS 普通数组的数字是浮点数,在有些场景例如 WebGL 中,需要使用二进制数据等,于是就引入了 Typed Array

ArrayBuffer

DataView

构造函数

const buf = new ArrayBUffer(16);
const view = new DataView(buf, 0 , 8);
view.byteLength;
view.byteOffset;
view.buffer === buf; // true

操作 buffer 需要使用到的 DataView 的要素

ElementType

边界情况

Typed Arrays

构建

属性

操作

其他操作

注意 slicesubarray 的区别:slice() 会完全复制一份新的,subarray 和原数组仍共用一个 ArrayBuffer

数值溢出

Map

Map 的遍历顺序

其他 API 请参考文档

Map 和 Object 的性能比较

WeakMap

基本 API

弱引用

使用场景

创造真正的私有属性

const User = (() => {
  const wm = new WeakMap();
  class User {
    constructor(id) {
      this.idProperty = Symbol('id');
      this.setId(id);
    }
    setPrivate(property, value) {
      const privateMembers = wm.get(this) || {};
      privateMembers[property] = value;
      wm.set(this, privateMembers);
    }
    getPrivate(property) {
      return wm.get(this)[property];
    }
    setId(id) {
      this.setPrivate(this.idProperty, id);
    }
    getId(id) {
      return this.getPrivate(this.idProperty);
    }
  }
  return User;
})();

const user = new User(123);
alert(user.getId()); // 123
user.setId(456);
alert(user.getId()); // 456

用来存储 DOM 节点的一些自定义属性

Set

API

基本 API 见文档

迭代

WeakSet

存放弱引用

用途

展开操作符 ...