琐碎
10.22
TypedArray
JavaScript 中的 TypedArray(类型化数组) 是一种用于处理**二进制数据(binary data)**的机制,它在 WebGL、文件 API、WebSockets 等需要处理字节流或原生内存操作的场景中至关重要。
简单来说,TypedArray 允许您创建和操作包含统一类型数值(如 8 位整数、32 位浮点数等)的数组,这与标准的 JavaScript 数组(可以包含任何类型的值)有本质区别。
组成结构:
| 作用 | 特点 | 类似 | |
|---|---|---|---|
| ArrayBuffer | 它是 TypedArray 的核心,代表一块通用的、固定长度的二进制原始数据缓冲区(raw binary data buffer) | 它本身不包含任何格式,也不能直接读取或写入。它就像一块没有标记的内存区域。 | 一块未切割的生面团。 |
| DataView | 提供一个低级别的接口,用于在 ArrayBuffer 中的任何位置**以不同的 Endianness(字节序)**读取和写入不同类型的数据。 | 它允许您以灵活的方式(例如先读取 8 位整数,再读取 32 位浮点数)查看同一块缓冲区。 | 一个可以用各种工具(勺子、刀子)对生面团的任何位置进行操作的接口。 |
| TypedArray Views | 这是我们通常说的 "TypedArray",它提供一个高层次、特定类型的接口,用于访问 ArrayBuffer 中的数据。 | 特定类型: 每个 View 实例只能包含一种数据类型,例如 Int8Array 只能包含 8 位带符号整数。高性能: 由于类型固定,引擎可以进行高度优化,性能接近 C 语言等底层数据结构。 操作像数组: 它们有 length 属性和许多标准数组方法(如 map, slice, forEach)。 | 一种专门用来切 8 毫米面条的机器。 |
WARNING
1 个字节等于 8 位
有符号表示支持负数,无符号指包括零及以上整数
示例
javascript
// 1. 创建一个 16 字节的原始数据缓冲区
const buffer = new ArrayBuffer(16)
console.log(buffer.byteLength) // 16
// 2. 创建一个 32 位带符号整数视图 (Int32Array)
// 16 字节 / 4 字节/元素 = 4 个元素
const int32View = new Int32Array(buffer)
// 3. 写入数据
int32View[0] = 42
int32View[1] = -100
console.log(int32View) // Int32Array(4) [42, -100, 0, 0]
// 4. 创建一个 16 位无符号整数视图 (Uint16Array)
// 16 字节 / 2 字节/元素 = 8 个元素
// ⚠️ 注意:两个视图共享同一块底层内存 (buffer)
const uint16View = new Uint16Array(buffer)
// 5. 查看数据变化 (由于字节序和元素大小不同,数据可能被重新解释)
console.log(uint16View)
// 在小端序机器上输出可能是:Uint16Array(8) [42, 0, 65436, 65535, 0, 0, 0, 0]
// 因为 42 (32位) 和 -100 (32位) 的底层字节被 16 位的视图读取了。10.21
js 数组移除某项
// -1 >>> 0 等于 Math.pow(2, 32),即最大安全数组长度,保证了如果能找到符合的 index,则进行删除操作,否则不改变数组
function removeItem<T>(array: T[], item: T) {
array.splice(array.indexOf(item) >>> 0, 1)
}接口数据量大的情况下如何优化
- 优化 json 空白,即进行压缩
- 简化 json key,将 name、age 这些完整的 key 转成 n、a 以减少传输量
- 新增 redis 缓存,但这种方向只能减少数据库查找时间
- 启用协商缓存
10.20
vConsole 不影响原生控制台所在行
以为是类似
boundOriginalLog.apply(undefined, args);这种魔法,但实践下来发现并不是,在经过tsup构建的方式,调试可执行代码发现其也改变了原生控制台的所在行;于是改变方面询问浏览器是如何知晓或决定代码所在行的,然后发现了
ignore_list, 该功能主要是忽略第三方的脚本对开发的干扰;于是在将之前的构建产物也加入ignore_list后,原生控制台的打印终于正确了;至此,我们可以发现,
vConsole这种第三方模块没有影响代码所在行是因为一般都是在node_modules下,而这个目录一般已经被浏览器加入了忽略列表,所以成形成了这种魔法效果chrome v141
新增了对
砌体布局支持 还处于语法决定阶段
