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

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

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

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就是这个进程的代码表示。

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可以在命令行传递参数

定时器
定时器任务:在间隔指定的时间后执行的任务。由于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 | 构建内存缓冲区对象 |