# Node.js 数据类型
# 1. Buffer
- 流式数据(非一次性加载完成的数据)由于产生和使用不一定同速,所以需要缓存区
- 寸尺需要临时占用大量内存的数据,内存中开辟的一片区域,用于存放二进制数据
- 流的生产者于消费者之间的速度通常是不一致的,因此需要buffer来暂存一些数据
- buffer大小通过highWaterMark参数指定,默认情况是16kB
# 创建Buffer
1. Buffer.from(buffer|array|string) 使用 堆外内存 新增buffer
2. Buffer.from(arrayBuffer) 浅拷贝 arrayBuffer, 共享内存
1. Buffer.alloc(size) 分配一个指定大小的 Buffer, 默认填0,使用UTF-8编码
2. Buffer.allocUnsafe(size) 分配一个未初始化的Buffer
1. 流式数据会 自动创建 Buffer, 手动创建 Buffer 需谨慎
# 创建Buffer - 坑
1. 预分配一个内部大小为Buffer.poolSize(8K)的 Buffer 实例,作为快速分配的内存池
2. 如果allocUnsafe/from(array) 的 size 小于4K,则从预分配的池子中分配
1. 绕开V8回收机制,使用专用回收机制,提高性能和内存使用效率
2. 但这种玩法会导致未初始化的数据块投入使用,造成数据泄露风险
# 使用buffer
- 转换格式
- 字符串:编码Buffer.from(string),解码buf.toString()
- JSON:buf.toJSON()
- 剪裁和拼接
- 剪裁:Buffer.slice() 表现与 Array.slice() 不同,返回Buffer 与原buf 共享内存
- 拼接:buf.copy/buf.concat 返回新的Buffer
- 比较和遍历索引
- 判断相等:buf1.equals(buf2) 比较的是二进制的值
- 索引:使用buf[index]形式进行索引,for...of/indexOf/includes 等Array方法也可以使用
#
# 2. Stream
- Stream 模块提供的是抽象接口,有很多模块实现了这个接口
- Stream 就是解决生产者和消费者问题的 一种方式, 解决异步IO问题
- Stream 模块对于流的使用者而言无需关心 readableSrc.pipe(writableDest)
# 3. Event/EventEmitter
EventEmitters --> Event (会进行event loop) --> Event Handlers
# 4. Error
# 错误种类
- 标准的JavaScript错误,比如:SyntaxError / ReferenceError
- 底层操作触发的系统错误,比如:文件读写
- 用户自定义错误
- 异常逻辑触发的AssertionError,通常来自assert模块
# 错误冒泡和捕获
- 所有通过Node.js或JavaScript运行时抛出的异常都是Error实例
- 大多数的异步方法都接受一个callback函数,该函数会接收一个Error对象传入作为第一个参数
好好读一下Node.js内置的错误信息,通常是见文知意,例如:ERR_ARG_NOT_ITERABLE
# 5. URL
- 弃用urlObjects,改用WHATWGURL
- 使用URLSearchParams操作参数
Object.fromEntries(new URLSearchParams('foo=bar & baz = qux'))
// {foo: 'bar', baz: 'qux'}
url.path(req.url).pathname
url.parse(req.url).query
Querystring.parse(url.parse(req.url).query)['params2']
#
# 6. 全局变量 - global
- 看上去像是全局变量的 存在,实际上仅存在于模块的作用域中
- __dirname
- __filename
- exports
- module
- require()
- 从JavaScript继承而来的全局变量
- console
- timer 全家桶
- global (容器)
- Node.js特有的全局变量
- Buffer
- process
- URL
- WebAssembly