💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
#### 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 ```