global对象
- __filename:返回当前模块文件的解析后的绝对路径,该属性其实并非全局,而是模块作用域下的
注意:__filename:是当前模块下的,不是全局的
console.log(__filename); // /Users/vlolet/Documents/study/node/module/6.js
// 不能使用全局变量访问
console.log(global.__filename) // undefined
- __dirname:返回当前模块文件所在目录解析后的绝对路径,该属性也不是全局的,而是在模块作用域下
注意:返回的是路径所在的文件夹,__filename返回的是具体文件
// 返回文件
console.log(__filename); // /Users/vlolet/Documents/study/node/module/6.js
// 返回文件夹
console.log(__dirname); // /Users/vlolet/Documents/study/node/module
process对象(进程)
process 对象是一个全局变量,它提供有关当前 Node.js进程的信息并对其进行控制。
它是一个全局对象,可以在任何地方都能访问到它,通过这个对象提供的属性和方法,我们可以对当前运行的程序的进程进行访问和控制
argv
- Array,一组包含命令行参数的数组
// 1.js
console.log(process.argv)
// 结果
[ '/usr/local/lib/node_modules/node/bin/node',
'/Users/vlolet/Documents/study/node/process/1.js' ]
- 执行的同时,命令后面可以带参数
- 开启当前进程的绝对路径
console.log(process.execPath) // /usr/local/lib/node_modules/node/bin/node
env
- 返回用户环境信息,当前系统环境
{ TERM_PROGRAM: 'vscode',
TERM: 'xterm-256color',
SHELL: '/bin/bash',
TMPDIR: '/var/folders/jc/9w15wg9d1vgbvmlzg7pz4fqw0000gn/T/',
Apple_PubSub_Socket_Render: '/private/tmp/com.apple.launchd.DGecWSVoCy/Render',
TERM_PROGRAM_VERSION: '1.43.0',
OLDPWD: '/Users/vlolet/Documents/study/node',
USER: 'vlolet',
COMMAND_MODE: 'unix2003',
SSH_AUTH_SOCK: '/private/tmp/com.apple.launchd.Y7B5Yihfzz/Listeners',
__CF_USER_TEXT_ENCODING: '0x1F5:0x19:0x34', PATH:
'/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/lib/node_modules/node/lib/node_modules/http-server/bin/:/usr/local/lib/node_modules/node/lib/node_modules/http-server/bin/',
vloletdeMacBook-Air:process vlolet$ node 1.js
{ TERM_PROGRAM: 'vscode',
TERM: 'xterm-256color',
SHELL: '/bin/bash',
TMPDIR: '/var/folders/jc/9w15wg9d1vgbvmlzg7pz4fqw0000gn/T/',
Apple_PubSub_Socket_Render: '/private/tmp/com.apple.launchd.DGecWSVoCy/Render',
TERM_PROGRAM_VERSION: '1.43.0',
OLDPWD: '/Users/vlolet/Documents/study/node',
USER: 'vlolet',
COMMAND_MODE: 'unix2003',
SSH_AUTH_SOCK: '/private/tmp/com.apple.launchd.Y7B5Yihfzz/Listeners',
__CF_USER_TEXT_ENCODING: '0x1F5:0x19:0x34',
PATH:
'/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/lib/node_modules/node/lib/node_modules/h
ttp-server/bin/:/usr/local/lib/node_modules/node/lib/node_modules/http-server/bin/',
PWD: '/Users/vlolet/Documents/study/node/process',
LANG: 'zh_CN.UTF-8',
XPC_FLAGS: '0x0',
XPC_SERVICE_NAME: '0',
SHLVL: '2',
HOME: '/Users/vlolet',
LOGNAME: 'vlolet',
SECURITYSESSIONID: '186a7',
COLORTERM: 'truecolor',
_: '/usr/local/bin/node' }
version
- 返回node版本
console.log(process.version) //v10.16.0
versions
- 返回node及node依赖包版本信息
console.log(process.versions)
- 结果
pid
- 当前进程的pid
console.log(process.pid) // 7368
title
- 当前进程的显示名称(Getter/Setter)
console.log(process.title) // node
arch
- 返回当前CPU处理器架构
console.log(process.arch) // x64
config
- 返回一个 Object,其中包含用于编译当前 Node.js 可执行文件的配置选项的 JavaScript 表示形式。 这与运行 ./configure 脚本时生成的 config.gypi 文件相同。
console.log(process.config)
-
结果
platform
- 返回当前操作系统平台
console.log(process.platform) // darwin
cwd()
- 返回当前进程的工作目录
console.log(process.cwd()); // /Users/vlolet/Documents/study/node/process
chdir(directory)
- 改变当前进程的工作目录
memoryUsage()
- 返回node进程的内存使用情况,单位是byte
console.log(process.memoryUsage())
/**{ rss: 25812992,
heapTotal: 6537216,
heapUsed: 4031056,
external: 8272 } */
exit(code)
- 退出
process.exit();
kill(pid)
- 向进程发送信息
process对象输入输出
stdin,stdout:标准输入输出流(IO)
- stdin:标准输入流
- stdout:标准输出流
- 标准输入设备:
向计算机输入数据和信息的设备。是计算机与用户或其他设备通信的桥梁。输入设备是用户和计算机系统之间进行信息交换的主要装置之一。键盘,鼠标,摄像头,扫描仪,光笔,手写输入板,游戏杆,语音输入装置等都属于输入设备。
- 标准输出设备:
输出设备(Output Device)是计算机硬件系统的终端设备,用于接收计算机数据的输出显示、打印、声音、控制外围设备操作等。也是把各种计算结果数据或信息以数字、字符、图像、声音等形式表现出来。常见的输出设备有显示器、打印机、绘图仪、影像输出系统、语音输出系统、磁记录设备等
- stdin和stdout提供了操作输入数据和输出数据的方法,我们也通常称为IO操作
stdout的作用:
- console.log的内部是由它们实现的。
process.stdout.write('hello') // hello
// 定义一个log方法,实现console的功能
function log(data){
process.stdout.write(data)
}
log('hello') // 输出hello
stdin的作用
- 默认情况下输入流是关闭的,要监听处理输入流数据,首页要开启输入流
// 开启输入流
process.stdin.resume();
// 用于监听用户的输入数据
process.stdin.on('data',function(chunk){
// chunk 是用户输入的字传进来,显示出来
// process.stdout.write('hello')
// 默认情况下是按下回车键
console.log('用户输入了:'+chunk)
})
-
用户输入完,按下回车,会将输入的值打印出来
实现a+b的例子
// 开启输入流
process.stdin.resume();
var a;
var b;
// 先在控制台打印提示
process.stdout.write('请输入a的值:');
// 监听用户输入,并将值赋值
process.stdin.on('data',function(chunk){
// 判断输入的是a
if(!a){
a = Number(chunk)
// 输入a之后提示输入b
process.stdout.write('请输入b的值:');
}else{
b = Number(chunk)
// 输入b之后,将a+b的结果输出
process.stdout.write('结果是:'+(a+b));
}
})
Buffer(类)
- 一个用于更好的操作二进制数据的类
我们在操作文件或者网络数据的时候,其实操作的就是二进制数据流,Node为我们提供了一个更加方便的去操作这种数据流的类Buffer,它是一个全局类
Buffer.alloc()/Buffer.allocUnsafe()
Buffer.alloc(size[, fill[, encoding]])
- size
新 Buffer 的所需长度,当我们为一个Buffer对象分配空间大小以后,其长度是固定的,不能更改 - fill
| | | 用于预填充新 Buffer 的值。默认值: 0。
const buf = Buffer.alloc(5, 'a');
console.log(buf) //
- encoding
如果 fill 是一个字符串,则这是它的字符编码。默认值: 'utf8'。
const buf = Buffer.alloc(11, 'aGVsbG8gd29ybGQ=', 'base64');
console.log(buf);
// 打印:
分配一个大小为 size 字节的新 Buffer。 如果 fill 为 undefined,则用零填充 Buffer。
const buf = Buffer.alloc(5);
console.log(buf) //
buf[6] = 10; // 给第六个值设置为10,打印出长度还是5 这个长度不会变
console.log(buf) //
// 修改位置为1的值
buf[1] = 2;
console.log(buf) //
Buffer.from(array)
const buf = Buffer.from([1, 2, 3]);
console.log(buf) //
buf[5] = 10;
console.log(buf) // //
Buffer.from(string[,encoding])
- string
要编码的字符串。 - encoding
string 的字符编码。默认值: 'utf8'。
创建一个包含 string 的新 Buffer。 encoding 参数指定 string 的字符编码。
const buf = Buffer.from('vloet');
console.log(buf) // 注意这是16进制的
// 校验这个是不是16进制是不是对应的'vlolet’
for(var i= 0;i< buf.length;i++){
// console.log(buf[[i]]) // 注意这是是二进制的 118 108 1111 101 116
// 转成16进制的看看是不是一样的,结果是相等的
// console.log(buf[i].toString(16)) // 转成16进制的 76 6c 6f 65 74
console.log(String.fromCharCode(buf[i])) // v l o et
}
const buf2 = Buffer.from ('free adn easy','utf-8')
console.log(buf2) //
注意下Buffer的长度
const str1 = 'vloet'
const buf1 = Buffer.from(str1)
console.log(str1.length) // 5
console.log(buf1.length) // 5
const str2 = '疏影流苏'
const buf2 = Buffer.from(str2)
console.log(str2.length) // 4
console.log(buf2.length) // 12
buf.length
- 返回内存中分配给 buf 的字节数。单位bytes, 不一定反映 buf 中可用数据的字节量。
虽然 length 属性不是不可变的,但改变 length 的值可能会造成不确定的结果。 如果想改变一个 Buffer 的长度,应该将 length 视为只读的,且使用 buf.slice() 创建一个新的 Buffer。
let buf3 = Buffer.alloc(10)
console.log(buf3) //
buf3 = buf3.slice(0,5);
console.log(buf3) //
buf[index]
获取或者设置在指定index索引位置的8为字节内容
buf.write(string[, offset[, length]][, encoding])
- buf.write(要写入的字符串,从BUffer的对象中的第几位开始写入,写入字符串的长度,写入字符串的编码)
根据参数offset偏移量和指定的encodeing编码方式,将参数strings数据写入buffer
const str = 'vlolet'
// 创建一个长度为5的Buffer类
console.log(Buffer.from(str)) //
const buf = Buffer.alloc(5)
// 将字符串写入buf类,注意字符截取
buf.write(str);
console.log(buf) //
- 其他参数含义
offset 偏移量是Buffer的,意思是将从buf对象的第一位写入字符串,Buffer是从零为开始的
const str = 'vlolet'
const buf = Buffer.alloc(5)
// 将字符串写入buf类,注意字符截取
//offset 偏移量是Buffer的,意思是将从buf对象的第一位写入字符串,Buffer是从零为开始的
buf.write(str,1) // 零位就是以00 填充的
console.log(buf) //
- length:写多少位字符串到Buffer中
const str = 'vlolet'
const buf = Buffer.alloc(5)
// 将字符串写入buf类,注意字符截取
//offset 偏移量是Buffer的,意思是将从buf对象的第一位写入字符串,Buffer是从零为开始的
buf.write(str,1,3) // 零位就是以00 填充的,写入3个字符串
console.log(buf) //
buf.toString([encoding[, start[, end]]])
const buf = Buffer.from('vlolet');
console.log(buf.toString()) // vlolet
console.log(buf.toString('utf-8',1,3)); // 从第一位且长度为3 lo
let buf2 = Buffer.from('疏影流苏');
console.log(buf2) //
console.log(buf2.toString('utf-8',1)) // ��影流苏 因为疏字是从第一位开始的,不完整所以乱码
根据encodeing参数(默认是'utf8')返回一个解码的string类型
buf.toJSON()
返回一个JSON标识的Buffer实例。JSON.stringify将会默认调用来字符串序列化这Buffer实例。
const buf = Buffer.from('vlolet');
console.log(buf.toJSON()) // { type: 'Buffer', data: [ 118, 108, 111, 108, 101, 116 ] } json对象
buf.slice([start[, end]])
返回一个新的buffer,这个buffer将会和老的buffer引用相同的内存地址。
注意:修改这个新的buffer实例slice切片,也会改变原来的buffer
- start
新 Buffer 开始的位置。默认值: 0。 - end
新 Buffer 结束的位置(不包含)。默认值: buf.length。 - 返回:
let buf = Buffer.from('vlolet')
console.log(buf) //
let buf1 = buf.slice()
console.log(buf1) //
let buf2 = buf.slice(2,4) // 从第二位开始截取到第四位,不包含第四位
console.log(buf2)
// 指向内存相同,改变的话会影响截取前的Buffer实例的值
buf2[0] = 2;
console.log(buf2) // 第0个变成2
console.log(buf) // 对应buffer的第2位也开始变成2了
buf.copy(target[, targetStart[, sourceStart[, sourceEnd]]])
进行buffer的拷贝
- target
, 要拷贝进的 Buffer 。 - targetStart
target 中开始写入之前要跳过的字节数。默认值: 0。 - sourceStart
buf 中开始拷贝的偏移量。默认值: 0。 - sourceEnd
buf 中结束拷贝的偏移量(不包含)。默认值: buf.length。
const buf = Buffer.from('vlolet')
let buf4 = Buffer.alloc(10)
console.log(buf) //
// 从buf4第一位插入,由被拷贝的buffer中,第2位开始,到第四位结束,但不包含四四位
buf.copy(buf4,1,2,4)
console.log(buf4) //
- 返回:
拷贝的字节数。
const buf = Buffer.from('vlolet')
let buf4 = Buffer.alloc(10)
// 将buf拷贝到buf4
buf.copy(buf4)
console.log(buf4) //
// 修改buf4,不会影响到被拷贝的buf的值
buf4[0] = 2
console.log(buf4) //
console.log(buf) //
类方法,静态方法,不需要生成实例的
Buffer.isEncoding(encoding)
encoding
要检查的字符编码名称。
如果给定的编码encodeing是有效的,返回true,否则返回false
- 返回:
console.log(Buffer.isEncoding('utf-8')) // Buffer是支持UTF-8的,所以返回true
console.log(Buffer.isEncoding('gbk')) // 不支持十六进制,返回false
console.log(Buffer.isEncoding('hex')) // true
Buffer.isBuffer(obj)
测试或者判断这个obj是否是一个Buffer
let arr = [1,2,3]
const buf = Buffer.alloc(10)
console.log(Buffer.isBuffer(arr)) // false
console.log(Buffer.isBuffer(buf)) //true
Buffer.byteLength(string[, encoding])
将会返回这个字符串真实byte长度。encoding默认编码是utf-8
let str1 = 'vlolet'
console.log(str1.length) // 6
console.log(Buffer.byteLength(str1)) // 6
let str2 = '疏影流苏'
console.log(str2.length) // 4
console.log(Buffer.byteLength(str2,'utf-8')) // 12
console.log(Buffer.byteLength(str2,'ascii')) // 4
Buffer.concat(list[, totalLength])
返回一个保存着将传入buffer数组中所有buffer对象拼接在一起的buffer对象
let str1 = 'vlolet'
let str2 = '疏'
let str3 = '水'
let list = [Buffer.from(str1),Buffer.from(str2),Buffer.from(str3)]
console.log(list) //[ ,, ]
// 会把数组拼接成一个buffer
console.log(Buffer.concat(list)) //
console.log(Buffer.concat(list,11)) //
Buffer类总结:
输入输出流对应的用户数据其实就是一个Buffer类
process.stdout.write('请输入内容:');
// 开启输入流
process.stdin.resume()
// 监听用户行为
process.stdin.on('data',function(chunk){
console.log(chunk) //
console.log(chunk.toString()) // a
// 当字符串拼接时,会自动调取toString()转换
console.log(`输入的内容是${chunk}`) // 输入的内容是b
})
-
结果