美文网首页
Node.js(五)global全局变量

Node.js(五)global全局变量

作者: 偶余杭 | 来源:发表于2019-03-03 13:26 被阅读0次

    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'事件。

    相关文章

      网友评论

          本文标题:Node.js(五)global全局变量

          本文链接:https://www.haomeiwen.com/subject/deayuqtx.html