Node.js(五)global全局变量

2019-03-03  本文已影响0人  偶余杭

global是Node.js中的全局命名空间对象,与浏览器不同,浏览器中顶层作用域是全局作用域,而Node.js中顶层作用域不是全局作用域。

看起来是全局变量实际不是的变量


有一些变量仅存在于模块范围内,这些变量在所有模块中都提供,所以看起来像是全局的,但实际不是。

Buffer类(缓冲器)


Buffer 类是一个全局变量,使用时无需 require('buffer').Buffer
Buffer 类用于在 TCP 流或文件系统操作等场景中处理字节流。
Buffer 类的实例类似于整数数组,大小是固定的,在 V8 堆外分配物理内存。 Buffer 的大小在创建时确定,且无法改变。
Buffer是八位字节组成的数组,可以有效的在JS中存储二进制数据。

api

//创建一个长度为10,用0填充的Buffer
const buf1 = Buffer.alloc(10);
console.log(buf1);

//创建一个长度为10,用01填充的Buffer
const buf2 = Buffer.alloc(10,1);
console.log(buf2);

//创建一个长度为10,用a的utf8编码填充的Buffer
const buf21 = Buffer.alloc(10,'a');
console.log(buf21);

//创建一个长度为11,用aGVsbG8gd29ybGQ=的base64编码填充的Buffer
const buf22 = Buffer.alloc(11, 'aGVsbG8gd29ybGQ=', 'base64');
console.log(buf22);

//创建一个长度为10,没有初始化的Buffer
// 这个方法比调用 Buffer.alloc() 更快,但返回的 Buffer 实例可能包含旧数据,因此需要使用 fill() 或 write() 重写。
const buf3 = Buffer.allocUnsafe(10);
console.log(buf3);

// 创建一个包含 [0x1, 0x2, 0x3] 的 Buffer。
const buf4 = Buffer.from([1, 2, 3]);
console.log(buf4);

// 创建一个包含 UTF-8 字节 [0x74, 0xc3, 0xa9, 0x73, 0x74] 的 Buffer。
const buf5 = Buffer.from('tést');
console.log(buf5);

// 创建一个包含 Latin-1 字节 [0x74, 0xe9, 0x73, 0x74] 的 Buffer。
const buf6 = Buffer.from('tést', 'latin1');
console.log(buf6);

返回:


返回结构

初始化,使用--zero-fill-buffers 命令行选项

为了安全起见,在创建Buffer的时候,通常都需要初始化,可以使用 --zero-fill-buffers 命令行选项来初始化,即将值初始化填充为0。
使用 --zero-fill-buffers 命令行选项时,new Buffer(size)Buffer.allocUnsafe()Buffer.allocUnsafeSlow()new SlowBuffer(size) 返回的 Buffer 在创建时会用 0 填充

$ node --zero-fill-buffers
> Buffer.allocUnsafe(5);
<Buffer 00 00 00 00 00>
初始化Buffer
注意:当调用 Buffer.allocUnsafe()Buffer.allocUnsafeSlow() 时,分配的内存是未初始化的(没有用 0 填充)。
这样虽然分配内存很快,但是分配的内存可能包含有旧数据,如果没有重写内存,那读取Buffer的时候,就会使旧数据泄露。

字符编码

当 Buffer 存入或取出字符串时,需要指定字符编码
Node.js 支持的字符编码有:

timer(定时器)


timer模块定义了一些定时器函数,暴露在全局,定时器函数都是全局变量,不需要调用require('timers') 来使用 API。
Node.js 中的定时器函数实现了与 Web 浏览器提供的定时器 API 类似的 API,但是使用了不同的内部实现(基于 Node.js 事件循环构建)。

Immediate 类

setImmediate()返回,传给clearImmediate()取消。

Timeout 类

此对象在内部创建,并从 setTimeout()setInterval() 返回。 它可以传给 clearTimeout()clearInterval() 以取消计划的操作

console


console 模块提供了一个简单的调试控制台,类似于 Web 浏览器提供的 JavaScript 控制台,导出了Console类(包含 console.log()、console.error() 和 console.warn() 等方法)和全局的console实例,配置为写入 process.stdoutprocess.stderr。 使用时无需调用 require('console')

console.assert(value[, ...message])

一个简单的断言测试,用于验证 value 是否为真。 如果不是,则记录 Assertion failed。 如果提供 message,则通过传入所有消息参数来使用 util.format() 格式化错误消息。 输出用作错误消息。

console.clear()

console.clear() 的具体操作可能因操作系统和终端类型而异。 对于大多数 Linux 操作系统,console.clear() 的操作与 clear 的 shell 命令类似。 在 Windows 上,console.clear() 将仅清除当前终端视图中 Node.js 二进制文件的输出。

console.error([data][, ...args])

用换行符打印到 stderr。

console.info([data][, ...args])
console.log([data][, ...args])
console.table(tabularData[, properties])

使用 tabularData(或使用 properties)的属性列和 tabularData 的行来构造一个表并记录它

console.table([{ a: 1, b: 'Y' }, { a: 'Z', b: 2 }]);

输出:


console.table
console.time([label])

启动一个计时器,用以计算一个操作的持续时间。 计时器由一个唯一的 label 标识。 当调用 console.timeEnd() 时,可以使用相同的 label 来停止计时器,并以毫秒为单位将持续时间输出到 stdout。 计时器持续时间精确到亚毫秒。

console.timeEnd([label])

停止先前通过调用 console.time() 启动的计时器,并打印结果到 stdout

console.time('100-elements');
for (let i = 0; i < 100; i++) {}
console.timeEnd('100-elements');

输出:


console.time

process


process 对象是一个全局变量,它提供有关当前 Node.js 进程的信息并对其进行控制。 作为一个全局变量,无需使用 require()。
process对象是EventEmitter的实例

EventEmitter(EventEmitter类):Emitter表示触发器,大多数Node.js核心API构建于异步事件驱动架构,其中有某些类型的对象(就是Emitter,也叫做触发器)会触发命名事件来调用函数(也叫做监听器)。以上的process对象就是一个触发器,也可以说是监听器。
所有能触发事件的对象都是EventEmitter类的实例。这些对象有一个eventEmitter.on()函数,用于将一个或多个函数绑定到命名事件上。事件命名通常采用驼峰式命名。

process对象设定了一些命名事件的处理:

process.on('exit', (code) => {
  console.log(`退出码: ${code}`);
});

在调用 'exit' 事件监听器之后,Node.js 进程将立即退出,从而导致在事件循环中仍排队的任何其他工作被放弃

process.on('warning', (warning) => {
  console.warn(warning.name);    // 打印告警名称
  console.warn(warning.message); // 打印告警信息
  console.warn(warning.stack);   // 打印堆栈信息
});

process还有一些属性或方法(只记录部分):

上一篇下一篇

猜你喜欢

热点阅读