Node.js(五)global全局变量

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

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


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

  • __dirname
  • __filename
  • exports
  • module
  • require()

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 支持的字符编码有:

  • 'ascii' - 仅支持 7 位 ASCII 数据。
  • 'utf8' - 多字节编码的 Unicode 字符。
  • 'utf16le' - 2 或 4 个字节,小端序编码的 Unicode 字符。支持代理对(U+10000 至 U+10FFFF)。
  • 'ucs2' - 'utf16le' 的别名。
  • 'base64' - Base64 编码。
  • 'latin1' - 将 Buffer 编码成单字节编码的字符串。
  • 'binary' - 'latin1' 的别名。
  • 'hex' - 将每个字节编码成两个十六进制字符。

timer(定时器)


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

Immediate 类

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

  • setImmediate(callback[, ...args]):预定在 I/O 事件的回调之后立即执行的 callback。当多次调用 setImmediate() 时,callback 函数将按照创建它们的顺序排队等待执行。
  • clearImmediate(immediate):取消由 setImmediate() 创建的 Immediate 对象。
Timeout 类

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

  • setInterval(callback, delay[, ...args]):预定每隔 delay 毫秒重复执行 callback

  • setTimeout(callback, delay[, ...args]):预定在 delay 毫秒之后执行一次性的 callback。可能不会精确地在 delay 毫秒时调用 callback。 Node.js 不保证回调被触发的确切时间,也不保证它们的顺序。 回调会在尽可能接近指定的时间调用。

  • clearInterval(timeout):取消由 setInterval() 创建的 Timeout 对象。

  • clearTimeout(timeout):取消由 setTimeout() 创建的 Timeout 对象

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对象设定了一些命名事件的处理:

  • 'beforeExit' 事件:当 Node.js 清空其事件循环并且没有其他工作要安排时,会触发 'beforeExit' 事件
  • 'exit' 事件:当 Node.js 进程因调用process.exit()或者事件循环完毕将退出时,则会触发 'exit' 事件
process.on('exit', (code) => {
  console.log(`退出码: ${code}`);
});

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

  • 'message' 事件:如果使用 IPC 通道衍生 Node.js 进程,则只要子进程收到父进程使用 childprocess.send() 发送的消息,就会触发 'message' 事件
  • 'warning' 事件:任何时候Node.js发出进程告警,都会触发'warning'事件
process.on('warning', (warning) => {
  console.warn(warning.name);    // 打印告警名称
  console.warn(warning.message); // 打印告警信息
  console.warn(warning.stack);   // 打印堆栈信息
});

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

  • process.argv:一个数组,其中包含当启动 Node.js 进程时传入的命令行参数
  • process.config:一个Javascript对象。此对象描述了用于编译当前Node.js执行程序时涉及的配置项信息
  • process.env:包含用户环境的对象
  • process.abort():使Node.js进程立即结束
  • process.exit([code]):以退出状态 code 指示 Node.js 同步地终止进程。 如果省略 code,则使用成功代码 0process.exitCode 的值(如果已设置)退出。 在调用所有的 'exit' 事件监听器之前,Node.js 不会终止
  • process.kill(pid[, signal]):将signal发送给pid标识的进程
  • process.send(message[, sendHandle[, options]][, callback]):如果Node.js进程是通过进程间通信产生的,那么,process.send()方法可以用来给父进程发送消息。 接收到的消息被视为父进程的ChildProcess对象上的一个'message'事件。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

  • https://nodejs.org/api/documentation.html 工具模块 Assert 测试 ...
    KeKeMars阅读 6,221评论 0 6
  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 8,618评论 0 3
  • Node.js是目前非常火热的技术,但是它的诞生经历却很奇特。 众所周知,在Netscape设计出JavaScri...
    w_zhuan阅读 3,578评论 2 41
  • 内容来自《Node.js开发指南》 核心模块是 Node.js 的心脏,它由一些精简而高效的库组成,为 Node....
    angelwgh阅读 864评论 0 1
  • 每个人的心里都有另一个自己。 最近总是无聊乱想,喜欢又讨厌着自己。自卑又高傲的人,安静又喧嚣的人,独...
    纽结阅读 507评论 0 1