Skip to content

琐碎

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

    新增了对砌体布局支持 还处于语法决定阶段