#### TypedArray
```
var buf = new ArrayBuffer(32);
buf.length; //32
//buf就是一个二进制buffer,长为32字节(256位),预先初始化全部为0
//在其基础上,可以放置一个视图
var arr = new Uint16Array(buf);
arr.length; //16
//16位无符号整型的类型数组
```
单个buf可以关联多个视图
```
var buf = new ArrayBuffer(2);
var v16 = new Uint16Array(buf);
var v8 = new Uint8Array(buf);
v16[0] = 3085;
v16[0].toString(16); //c0d
v8[0]; //13
v8[1]; //12
v8[0].toString(16); //d
v8[1].toString(16); //c
//交换
var tmp = v8[0];
var v8[0] = v8[1];
v8[1] = tmp;
v16[0]; //3340
```
```
Int8Array //8位有符号整型
Uint8Array //8位无符号整型
Int16Array
Uint16Array
Int32Array
Uint32Array
Float32Array
Float64Array
```
要清楚,TypedArray的元素是限制在声明的位数大小中,如果视图给一个Uint8Array的某个元素赋值为大于8位的值,这个值会被折回来适应其位宽
```
var a = new Uint8Array(3);
a[0] = 10;
a[1] = 20;
a[2] = 30;
var b = a.map(v = > v*v);
b; //[100, 144, 132];
//因为
//100是1100100是7位
//400是110010000是9位,被折成10010000也就是144
//900是1110000100,被折成10000100也就是132
```
#### Map
对象的key只能是string
```
var o = {}, a = {id: 1}, b = {id: 2}
o[a] = "foo";
o[b] = "bar";
o[a]; //bar
o[b]; //bar
//因为a和b这两个key都被转成了字符串[object Object],导致键值重复,先者被覆盖
```
```
var o = new Map();
o.set(a, "foo");
o.set(b, "bar");
o.size; //2
o.delete(b);
o.size; //1
o.clear(); //清空所有
o.size; //0
```
```
//Map的参数必须是一个iterable
var m = new Map(o.entries());
//因为map的实例是iterable,与entries相同
var m = new Map(o);
//也可以是其他iterable
var a = {id: 1}, b = {id: 2}
var m = new Map([
[a, "foo"],
[b, "bar"]
]);
m.get(a); //foo
m.get(b); //bar
var m = new Map([[1, 2], [3, 4]]);
m.get(1); //2
m.values(); //MapIterator{2, 4}
m.entries(); //MapIterator{1 => 2, 3 => 4}
var vals = [...m.values()]; //[2, 4] 等价于Array.from(m.values())
var vals = [...m.entries()];
vals; //[[1, 2], [3, 4]]
var keys = [...m.keys()]; //[1, 3]
//判断是否有某个键
m.has(1); //true
```
#### WeakMap
WeakMap是Map的变体,二者多数行为是一致的,区别在于内存分配和垃圾回收机制(GC)的工作方式
WeakMap只允许对象作为key,如果对象自身被垃圾回收的话,WeakMap相应的这个项目也会被移除。更准确的来说是:WeakMap 中的对象都是弱引用,即垃圾回收机制不考虑 WeakMap 对该对象的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在于 WeakMap 之中。
WeakMap没有size属性和clear方法,也不会暴露任何key、value和迭代器,因此,你就当做只能操作set、get、has、delete()就好。
```
var m = new WeakMap();
var x = {id: 1}, y = {id: 2}, z = {id: 3}, w = {id: 4};
m.set(x, y);
x = null;
//无法获取x的value了
m.get(x); //undefined
m.set(z, w);
w = null;
m.get(z); //{id: 4} 依旧可以获取
```
#### Set
set是一个值得集合,其中的值唯一(重复的会被忽略),set的值不允许强转,也就是1和"1"是两个不同的值。
api和map类似,只是set变成了add并且没有get方法
```
var s = new Set();
var x = {id: 1}, y = {id: 2}
s.add(x);
s.add(y);
s.add(x);
s.size; //2
s.delete(y);
s.size; //1
s.clear();
s.size; //0
```
Set的构造器和Map相似,但Map接受键/值数组的数组,而Set接受value数组即可
```
//自行对比Map
new Map([[1, 2], [3, 4]]);
new Set([2, 4]);
var a = {id: 1};
var s = new Set();
s.add(a);
s.has(a); //true
```
```
var s = new Set([2, 4]);
var keys = [...s.keys()]; //[2, 4]
var vals = [...s.values()]; //[2, 4]
var entries = [...s.entries()]; //[[2, 2], [4, 4]]
```
#### WeakSet
同WeakMap
```
var s = new WeakSet();
var a = {id: 1}, b = {id: 2};
s.add(a).add(b);
a = null; //a可GC
```
同样的,WeakSet的值只能是对象
```
new WeakSet([1, 2]); //Invalid value in weak set
```
- 你不知道的JS上
- 第一部分 第三章 函数作用域和块作用域
- 第一部分 第四章 提升
- 第一部分 第五章 闭包
- 第二部分 第一章 关于this
- 第二部分 第二章 this全面解析
- 第二部分 第三章 对象
- 第二部分 第五章 原型
- 第二部分 第六章 行为委托
- 你不知道的JS中
- 第一部分 第二章 值
- 第一部分 第三章 原生函数
- 第一部分 第四章 强制类型转换
- 第一部分 第五章 语法
- 第二部分 第一章 异步
- 第二部分 第三章 Promise
- 第二部分 第四章 生成器
- 第二部分 第五章 性能
- 你不知道的JS下
- 第一部分 总结
- 第二部分 第二章 语法
- 第二部分 第三章 代码组织
- 第二部分 第四章 Promise
- 第二部分 第五章 集合
- 第二部分 第六章 新增API
- 第二部分 第七章 元编程
- 第二部分 第八章 ES6之后