2018-10-08NodeJs的笔记(2)
主要记录一下此次对于Buffer的常用静态方法和常用实例方法,为后续的实战铺垫
setImmediate与process.nextTick, setTimeout的执行顺序 (续上一次笔记的process部分)
结论:process.nextTick 早于 setTimeout 早于setImmediate
- nextTick表示把自己放在当前事件队列的最后一个
- setImmediate表示把自己放在当前事件队列的下一个队列的队首
-
timeout则放在二者中间
image.png
看起来似乎nextTick和Immediate是一样的作用,但实际上大部分时候都是使用Immediate,这是官方后来放上来的一个优化版本,其次呢,process在当前执行队列的队尾执行,如果它没有执行,那么下一个队列就不会开始执行,(nodejs会一直检查事件队列),最后,如果process.nextTick里嵌套了另一个process.nextTick,被嵌套进去的那个nextTick会再被插进队尾,如果后续插入的一些东西出现了循环调用或者长时间的调用,那么后面可能根本没有机会去执行。
buffer的一些特性:
- 用于处理二进制数据流
- 实例类似于整数数组,大小固定
- C++代码在v8堆外分配物理内存
使用Buffer.alloc(length, value)创建的数组是不能再改动的, 且Buffer在创建时大小就已经被确定,且value如果不传入数据的话,就默认给数组都填充为0(0x0,十六进制的0)
常用的Buffer的静态方法:
- Buffer.byteLength
- Buffer.isBuffer()(用于判断被监测的变量是否是Buffer类型)
- Buffer.concat()(用于拼接Buffer,并且不传入多个变量,而是传入一个Buffer对象组成的数组)
常见的实例方法以及属性:(以下的buf指代Buffer实例)
buf.length
buf.toString()
buf.fill()
buf.equals()
buf.indexOf()
buf.copy()
- Buffer对象的长度(此处的长度并非是Buffer对象里面字符的长度是多少就显示多少位,而是我们在创建Buffer对象的时候申请了多少位,就显示多少位)
-
buf.toString()是将Buffer对象转为字符串,并且是可以传入参数的,如base64这样的编码方式
fig-4 -
buf.fill() 在初始化的时候将Buffer对象填入初始值,可以给fill方法传入参数,从x开始到y,且x是从1开始数的
fig-5 -
equals主要是用于判断两个Buffer对象的内容是否一致,而非判断两个命名不同而内存位置和内容一致的Buffer对象
-
由于一开始学习的时候就得知Buffer实际上是一种TypedArray,所以对于此种类数组的对象,它的一些index方法可以参照数组学习,此处不做赘述
-
关于copy,主要记录一下它的使用方法,
buffer.copy(target, targetStart, sourceStart, sourceEnd);
Parameter | Description |
---|---|
target | Required. The array of buffers to concat |
targetStart | Optional. A number specifying where to begin copying to. Default 0 |
sourceStart | Optional. A number specifying where to begin copying from. Default 0 |
sourceEnd | Optional. A number specifying where to stop copying from. Default end of buffer |
对于NodeJS里中文乱码的解决方案(后续还会有补充,这只是当前学习到的一种)
var stringDecoder = require('string_decoder').StringDecoder;
decoder = new StringDecoder('utf-8');
使用decoder.write(//Buffer对象);就可以正确表达对应的内容了
·