这是我参与「第四届青训营 」笔记创作活动的第3天
- 理解Buffer
- ArrayBuffer
通用的、固定长度的原始二进制数据缓冲区,不可以直接操作,而是通过类型数组对象(TypedArray)操作,将缓冲区中的数据表示为特定的格式。可以将其理解为一块内存,具体存什么需要其他的声明
- Unit8Array
表示一个8位的无符号整型数组,创建的时候内容被初始化为0
- ArrayBuffer与TypedArray的关系
TypedArray:Uint8Array, Int32Array, Int16Array
ArrayBuffer: 本身是一个0、1存放在一行里的集合
关系:使用TypedArray划分ArrayBuffer中的二进制字节,
- node中使用Buffer
Buffer实现了Uint8Array的api
Buffer的实例 => 整型数组 (用于表示编码字符的序列 UTF-8 Base64 十六进制)
Buffer的大小是固定的,在创建时就确定了,无法调整
- 理解Stream
shell通过管道连接各个部分,输入和输出的规范是文本流
nodejs内置的Stream模块实现了类似的功能,各个部分之间通过pipe()连接
流中的数据默认情况下都是Buffer类型。产生的数据一放入流中,便转成Buffer被消耗;写入的数据在传给底层写逻辑时,也被转成Buffer类型。
- Stream.Readable 可读
创建可读流时需要继承Readable并实现_read方法
- _read方法是从底层系统读取具体数据的逻辑,即生产数据的逻辑。
- 在_read方法中,通过调用push(data)将数据放入可读流中供下游消耗。
- 在_read方法中,可以同步调用push(data),也可以异步调用。
- 当全部数据都生产出来后,必须调用push(null)来结束可读流。
- 流一旦结束,便不能再调用push(data)添加数据。
- Stream.Writeable 可写
Readable通过继承的方式去创建一类可读流,Writeable也适用于创建一类可写流,只是需要实现的是write(data, enc, next)方法,而不是read()方法
- 上游通过调用writable.write(data)将数据写入可写流中。write()方法会调用_write()将data写入底层。
- 在_write中,当数据成功写入底层后,必须调用next(err)告诉流开始处理下一个数据。
- next的调用既可以是同步的,也可以是异步的。
- 上游必须调用writable.end(data)来结束可写流,data是可选的。此后,不能再调用write新增数据。
- 在end方法调用后,当所有底层的写操作均完成时,会触发finish事件。
- Stream.Duplex 可读可写
Duplex实际上就是继承了Readable和Writable的一类流。 所以,一个Duplex对象既可当成可读流来使用(需要实现read方法),也可当成可写流来使用(需要实现write方法)。
- Stream.Transform 可读可写可变换
Duplex的例子中,可读流中的数据(0, 1)与可写流中的数据(’a’, ‘b’)是隔离开的,但在Transform中可写端写入的数据经变换后会自动添加到可读端。 Tranform继承自Duplex,并已经实现了read和write方法,同时要求用户实现一个_transform方法。
- node中的全局对象
Node.js 中的全局对象是 global,所有全局变量(除了 global 本身以外)都是 global 对象的属性。
global 最根本的作用是作为全局变量的宿主
全局变量的定义:在最外层定义的变量;全局对象的属性;隐式定义的变量(未定义直接赋值的变量)。
- 全局变量__filename
__filename 表示当前正在执行的脚本的文件名。它将输出文件所在位置的绝对路径,且和命令行参数所指定的文件名不一定相同。 如果在模块中,返回的值是模块文件的路径。
- 全局变量__dirname
__dirname 表示当前执行脚本所在的目录。
-
全局方法 setTimeout(cb, ms), clearTimeout, setInterval, clearInterval, console,
-
全局变量 process
用于描述当前Node.js 进程状态的对象,提供了一个与操作系统的简单接口。
- 异步I/O