深入理解Nodejs Global 模块

浏览器上有自己的全局对象 window,同理, nodejs 下也有自己的全局对象 global,并且在各个模块下 都可以直接访问 global 对象。

在 nodejs 中,除了可以直接使用 V8 JavaScript 引擎中所支持的原生 JavaScript 的函数和对象外,它还追加了一些其他的函数和对象(比如:Buffer 对象、require 函数等)。

Buffer 对象: 用于处理二进制数据

module 对象: 用于访问当前模块的信息

process 对象: 用于访问进程信息

console 对象: 用于向控制端输出某些信息

6 个计时器相关函数

需要注意的是,可以在不引入模块的情况下直接使用 nodejs 追加的这些函数和对象。

下面将对上面的这些对象和函数的使用进行简单的解释。

Buffer 对象

在 ES6 之前,原生的 JavaScript 并没有专门用来处理二进制数据的机制,所以为了方便地处理二进制数据,nodejs 才引入了 Buffer 对象。

ES6 之后,原生的 JavaScript 引入了 ,用来处理二进制数据。注意 TypedArray 并不是以一个单一的对象的形式而存在,而是以一系列值的类型为 TypedArray 的对象而存在。在这一系列对象中,Uint8Array 对象和 Buffer 对象最为相似,但是 Buffer 对象更加适用于 nodejs。

Buffer 对象的实例很像一个各个元素都是整数的数组,但是与真正的数组的区别在于它的大小固定的(即在实例创建时决定大小),并且为它分配的内存是原生的,并且存在于 V8 的堆内存外。
在 nodejs 6.0 版本之前,是使用 new Buffer() 语法来创建一个实例,但是因为一些安全问题,以这种形式创建实例的方法被废除了,取而代之的是一些 Buffer 对象的一些静态方法。

创建 Buffer 实例

Buffer.alloc(size[, fill[, encoding]]): 返回一个指定大小的 Buffer 实例,如果没有设置 fill,则默认填满 0

Buffer.allocUnsafe(size): 返回一个指定大小的 Buffer 实例,但是它不会被初始化,所以它可能包含敏感的数据

Buffer.allocUnsafeSlow(size)

Buffer.from(array): 返回一个被 array 的值初始化的新的 Buffer 实例(传入的 array 的元素只能是数字,不然就会自动被 0 覆盖)

Buffer.from(arrayBuffer[, byteOffset[, length]]): This creates a view of the ArrayBuffer without copying the underlying memory

Buffer.from(buffer): 复制传入的 Buffer 实例的数据,并返回一个新的 Buffer 实例

Buffer.from(string[, encoding]): 返回一个被 string 的值初始化的新的 Buffer 实例

const buf1 = Buffer.alloc(5); const buf2 = Buffer.allocUnsafe(5); const buf3 = Buffer.from([1, '2a', 230]); const buf4 = Buffer.from('abcdggg'); console.log(buf1); // <Buffer 00 00 00 00 00> console.log(buf2); // <Buffer b8 ed a3 80 58> (这只是一种可能的结果) console.log(buf3); // <Buffer 01 00 e6> console.log(buf4); // <Buffer 61 62 63 64 67 67 67> console.log(buf4.toString()); // abcdggg buf2.fill(0); console.log(buf2); // <Buffer 00 00 00 00 00>

上面讲的不太清楚(以后再优化),因为我是初学,TypedArray 都没玩过呢!

但是放心,大腿在这呢 — Node源码解析 – buffer

源码链接: buffer.js

Buffer.byteLength(string[, encoding]): 返回 string 的实际的字节长度(注意不是字符长度)

let str1 = 'a'; let str2 = '小'; let str3 = 'aa'; let str4 = '小a'; console.log(str1.length); // 1 console.log(Buffer.byteLength(str1)); // 1 console.log(str2.length); // 1 console.log(Buffer.byteLength(str2)); // 3 console.log(str3.length); // 2 console.log(Buffer.byteLength(str3)); // 2 console.log(str4.length); // 2 console.log(Buffer.byteLength(str4)); // 4

上面的汉字 小 的 UTF-8 码正好占用三个字节(\xE5\xB0\x8F),所以才会有上面的结果。

Buffer.concat(list[, totalLength]): 连接多个 Buffer 实例或 Uint8Array 实例,并返回一个新的 Buffer 实例

const buf1 = Buffer.alloc(10); const buf2 = Buffer.alloc(14); const totalLength = buf1.length + buf2.length; console.log(totalLength); // 24 const buf = Buffer.concat([buf1, buf2], totalLength); console.log(buf.length); // 24

Buffer.isBuffer(obj): 判断一个对象是不是 Buffer 实例

Buffer.isEncoding(encoding): 判断是否支持指定的编码方式

console.log(Buffer.isEncoding('utf8')); // true console.log(Buffer.isEncoding('utf9')); // false

Buffer.poolSize: 指定预分配的字节数的大小,默认为 8192(即 8 KB)

Buffer.prototype.buffer: 一个指向 ArrayBuffer 的引用

const arrayBuffer = new ArrayBuffer(16); const buffer = Buffer.from(arrayBuffer); console.log(buffer.buffer === arrayBuffer); // true

Buffer.prototype.equals(otherBuffer): 比较两个 Buffer 实例是否拥有完全相同的 bytes

const buf1 = Buffer.from('hello'); const buf2 = Buffer.from('hello'); console.log(buf1.equals(buf2)); // true

用于迭代的方法

Buffer.prototype.entries()

Buffer.prototype.keys()

Buffer.prototype.values()

Buffer.prototype.fill(value[, offset[, end]][, encoding]): 用指定的值填充满 Buffer 实例

const b = Buffer.allocUnsafe(25).fill('abc呵呵'); // 注意下面因为不够容纳全部的汉字字节,所以乱码 console.log(b.toString()); // abc呵呵abc呵呵abc呵�

Buffer.prototype.includes(value[, byteOffset][, encoding])

Buffer.prototype.indexOf(value[, byteOffset][, encoding])

Buffer.prototype.toJSON(): 返回一个 JSON 对象

当 JSON.stringify(buf) 的参数为一个 Buffer 实例时,会隐式地调用上面的方法

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wyxsyf.html