Node.js中的全局对象(Node.js自学第三天)

451 阅读7分钟

window

嵌入在浏览器中的V8引擎,支持ES原生对象、BOM和DOM对象,全局对象为BOM中的window;
声明全局作用域的变量和函数默认为window对象的成员,大量使用全局变量和函数这样容易造成全局对象污染!

image.png

global

独立的Node.js环境,不支持BOM和DOM对象,全局对象称为global/GLOBAL;
声明的全局变量和函数在交互模式下是global对象的成员——全局对象污染;

image.png

而脚本模式下不是global对象的成员——避免了全局对象的污染。(属于脚本本地的属性成员)

image.png

console

global.console对象类似于Chrome中的console对象,用于向stdout(标准输出)和stderr(标准错误)中输出信息。

var data={id:3,count:36,list:[]};

console.log(`COUNT IS:%d`,data.count);		//向stdout输出日志信息(%d表示数字,%s表示字符串)
console.info(`COUNT IS:${data.count}`);		//console.log()的别名

console.error(`COUNT IS:${data.count}`);	//向stderr输出错误信息
console.warn(`COUNT IS:${data.count}`);		//console.error()的别名

console.trace('Stack Trace');							//向stderr输出栈轨迹信息

//向stdout输出指定对象的字符串
console.dir(data);

一些简单的代码测试可以使用断言功能:

//为真的断言,错误信息不会输出
console.assert(data.count>0,'count等于0');

//为假的断言,抛出AssertError对象,输出错误信息,且终止脚本执行
console.assert(data.list.length>0,'没有可用数据!');

使用console对象测量代码执行耗时:

console.time('LONG-LOOP');//开始计时
for(var i=0;i<1000;i++){}
console.timeEnd('LONG-LOOP');//计时结束
//输出结果:LONG-LOOP:0.134ms

process

process:Object
表示执行当前解释器运行所在的进程对象。
可以使用该对象获取当前操作系统及运行时信息,并操作脚本执行进程。
当操作系统启动Node.js解释器执行一个脚本文件时,会将必需的文件从文件系统调入内存,分配必须的内存空间,执行其中的代码——此过程就创建了一个执行进程。全局对象global.process就是这个进程的代码表示。

image.png

process对象中与操作系统相关的成员:

process.arch					//获取CPU架构类型
process.platform			//获取操作系统类型
process.env						//获取操作系统系统环境变量

var start=process.hrtime()		//获取高精度的计时器(纳秒级)
setTimeout(()=>{
	var diff=process.hrtime(start);
  console.log('精准耗时:%d',diff[0]*1e9+diff[1])
},1000)

process.hrtime()返回值是一个数组,第一个参数是这段代码执行花费的秒,第二个参数是代码执行花费的纳秒。两参数相加的和就是完整的耗费时间。

process对象中当前解释器和脚本相关的成员:

process.cwd()					//获取当前所在工作目录
process.execPath			//获取解释器所在目录
process.execArgv			//获取解释器执行参数(交给node解释器的参数)
process.argv					//获取解释器运行时的命令参数(交给当前脚本的参数)
process.version				//获取Node.js版本信息
process.uptime()			//获取Node.js解释器运行时间(s)
process.memoryUsage()	//获取内存信息

process.pid						//获取进程ID号
process.kill(pid)			//向指定进程ID号发送退出信号

execArgv和argv的区别:
创建一个app6.js

console.log(process.execArgv)
console.log(process.argv)

在cmd执行app6.js可以在命令行传递参数

image.png

定时器

定时器任务:在间隔指定的时间后执行的任务。由于Node.js是单线程处理模型,所以到期要执行的定时器任务统一进入一个事件循环队列,由Node.js解释器依次调用执行。

Node.js提供了四种形式的定时器:

process.nextTick( ) 本次事件循环结束时立即执行的定时器
global.setImmediate( ) 下次时间循环立即执行的定时器
global.setTimeout( ) 一次性定时器
global.setInterval( ) 周期性定时器

setInterval

setInterval(callback ,delay):function
设置一个按指定周期不断执行的定时器。

每隔delay毫秒重复调用回调callback。注意,取决于外部因素,如果操作系统定时器粒度及系统负载,实际间隔可能会改变。

间隔值必须1-2147483647的范围内(包含1和2147483647)。如果该值超出范围,则该值被当作1毫秒处理。一般来说一个定时器不能超过24.8天。

返回一个代表该定时器的引用。

clearInterval(timer):function
停止一个之前通过setInterval()创建的定时器。回调不会再被执行。

var count=0;
var timer=setInterval(function(){
	console.log(count++);
  if(count>=5){
  	clearInterval(timer);
  }
},1000)
console.log('任务已安排');
//任务已安排
//0
//1
//2
//3
//4

setTimeout

setTimeout(callback,delay):function
设置一个一次性定时器。

每隔delay毫秒重复调用回调callback。注意,取决于外部因素,如果操作系统定时器粒度及系统负载,实际间隔可能会改变。

间隔值必须1-2147483647的范围内(包含1和2147483647)。如果该值超出范围,则该值被当作1毫秒处理。一般来说一个定时器不能超过24.8天。

返回一个代表该定时器的引用。

clearTimeout(timer):function
停止一个之前通过setTimeout()创建的定时器。回调不会再被执行。

var count=0;
var timer=setTimeout(function(){
          	console.log(count++);
						if(count<5){
            	setTimeout(arguments.callee,1000);
            }else{
            	clearTimeout(timer);
            }
          },1000);
 console.log('任务已安排');
//任务已安排
//0
//1
//2
//3
//4

setImmediate

setImmediate(callback):function
设置一个尽可能立即执行的异步任务——下次事件循环开始时。

语义上,相当于setTimeout(callback,0);但是最终执行时机,决定于系统定时器粒度和系统负载。

返回一个代表该定时器的引用。

var count=0;
var timer=setImmediate(function(){
    console.log(count++);
    if(count<5){
        setImmediate(arguments.callee);
    }else{
        clearImmediate(timer);
    }
});
console.log('任务已安排');
//任务已安排
//0
//1
//2
//3
//4

注意:setImmediate是立即执行的定时器任务,那么为什么还是会先输出"任务已安排"在执行定时器中的内容?因为setImmediate是放到了下一次事件环开始时,console.log是在本次事件队列当中。

process.nextTick

nextTick定时器不同于setTimeout(fn,0)或者setImmediate(fn),它指定的定时器任务在本次事件循环结束时立即执行,先于IO事件回调或其他定时器任务。

process.nextTick(()=>{
	console.log("nextTick任务...");//先于IO事件回调和其他定时器回调
})
console.log('任务已安排');

我们可以测试对比一下nextTick和其他定时器的执行循序:

setImmediate(()=>{
    console.log("Immediate任务1...");
})
process.nextTick(()=>{
    console.log("nextTick任务1...");
});
setImmediate(()=>{
    console.log("Immediate任务2...");
})
process.nextTick(()=>{
    console.log("nextTick任务2...");
});
console.log("end...");
//end...
//nextTick任务1...
//nextTick任务2...
//Immediate任务1...
//Immediate任务2...

其他定时器都会放在下一次事件环当中,nextTick实在本次事件循环的结尾就开始执行了。

更多的全局函数

函数名 说明
decodeURI ( ) 解析一个编码的URI
decodeURIComponent ( ) 解码一个编码的URI组件
encodeURI ( ) 把字符串编码为URI
encodeURIComponent ( ) 把字符串编码为URI组件
escape ( ) 对字符串进行编码
unescape ( ) 对由escape()编码的字符串进行解码
parseInt ( ) 解析一个字符串并返回一个整数
parseFloat ( ) 解析一个字符串返回一个浮点数
isNaN ( ) 检查是否为NaN
isFinite ( ) 检查是否为有穷大的数字
eval ( ) 计算指定字符串,将其作为语句来执行

更多的全局构造方法

对象名 说明
JSON JSON.parse( )和JSON.stringify( )
Math 数字常量和数字函数
Array 构造数组对象
Boolean 构建布尔对象或布尔类型转换
Date 构建日期对象
Error(及其子类型) 构建错误及异常对象
Function 构建函数对象
Number 构建数字对象及数字类型转换
Object 构建对象
String 构建字符串对象及字符串类型转换
Buffer 构建内存缓冲区对象