数组是异质对象,代理它的读写操作时,有一部分需要单独处理。
- 数组对象的内部方法 [[DefineOwnProperty]] 与常规对象不同(定义在规范 10.4.2.1 节),仅此一点就使它成为异质对象;
- 除此之外的其他内部方法,逻辑与常规对象相同,因此代理普通对象的绝大部分代码可以继续使用。
| 读取方式 | 示例 | 拦截器 |
|---|
| 索引访问元素 | arr[0] | get |
| 访问长度 | arr.length | get(key 为 'length') |
| 把数组当对象遍历 | for (const k in arr) {} | ownKeys |
| 迭代遍历 | for (const v of arr) {} | get + Symbol.iterator(见 5.7.2) |
| 不改变原数组的原型方法 | concat / join / every / some / find / findIndex / includes 等 | get(见 5.7.3) |
| 设置方式 | 示例 | 额外影响 |
|---|
| 通过索引修改元素 | arr[1] = 3 | 索引 ≥ 长度时会隐式改变 length |
| 修改长度 | arr.length = 0 | 会隐式删除索引 ≥ 新长度的元素 |
| 栈方法 | push / pop / shift / unshift | 会隐式读取/修改 length(见 5.7.4) |
| 修改原数组的原型方法 | splice / fill / sort 等 | 同上 |