node--概述、规范、Buffer对象

目录

概述

CommonJS规范

特点

主要内容

Buffer对象

基本操作

与二进制数组的区别

Buffer类

Buffer常用方法

写入缓冲区

缓冲区读取数据

Buffer转换JSON

缓冲区合并

缓冲区比较

拷贝缓冲区

缓冲区裁剪

缓冲区长度


概述

        Node.js是运行在服务端的JavaScript。Node.js搭建了一个JavaScript的服务器运行环境,JavaScript可以脱离浏览器直接运行。可以将Node理解为JavaScript的虚拟机,虚拟的构建一个JavaScript的运行环境。

        Node.js适合场景

        1.实时性应用

        2.以I/O为主的高并发应用

        3.流式应用

        4.前后端分离

CommonJS规范

        Node应用由模块组成,Node遵循了CommonJS的模块规范。CommonJS是一套代码规范,目的是构建JavaScript再浏览器之外的生态系统,通过此规范使得JavaScript具备开发复杂应用、跨平台的能力。

特点

        1.代码运行在当前模块作用域中,不会污染全局作用域

        2.模块同步加载(根据代码中出现顺序依次加载)

        3.模块可以多次加载,但只会在第一次加载时运行一次,之后运行结果被缓存,再度加载直接读取缓存结果。再次运行模块必须先清除缓存

主要内容

        1.导入模块:require('模块名称')

        require命令基本功能:读入并执行一个JavaScript文件--返回该模块的exports对象/没有发现指定模块则报错

        加载规则:

        (1)用于加载js文件,默认文件扩展名.js

        (2)根据参数的不同格式去不同路径下查找相应的js文件

             '/'开头字符串:表示加载一个位于绝对路径的模块文件

             './'或'../'开头字符串,表示加载一个位于相对路径的模块文件

             上述均不是表示加载的模式是node默认提供的核心模块,或者一个位于各级node_modules目录的已安装模块

        2.导出模块:module.export 导出模块

        每个导出的模块都有一个module对象代表当前模块,其包含属性如下:

● module.id:模块识别符,通常是带有绝对路径的模块文件名

● module.filename:模块文件名,带有绝对路径

● module.load:返回一个布尔值,表示模块是否已经加载完成

● module.parent:返回一个对象,表示调用该模块的模块

● module.children:返回一个数组,表示该模块要用到的其他模块

● module.exports:表示当前模块对外输出的接口。Node为每个模块提供给一个exports变量指向module.exports,不能直接指向一个值

var exports = module.exports;

● module.paths:从当前文件目录开始查找,依次进入父目录迭代直至根目录的node_modules目录

Buffer对象

        Buffer对象是Node处理二进制数据的一个接口,它是Node原生提供的全局对象,可以直接使用,不需要导入。

        JavaScript不擅长处理二进制数据,为了解决该现象Buffer对象应运而生。

        Buffer是一个构造函数,生成的实例代表V8引擎分配的一段内存,是一个类似数组的对象,成员为0~255的整数值。

基本操作

● 创建

        let Buffer对象 = new Buffer(size)

let test = new Buffer(256);

● 切片

        Buffer对象.slice(start,end)

// 创建Buffer对象实例
let test = new Buffer(256);
// 遍历每个字节,写入内容
for(let i=0;i<test.length;i++){
    test[i] = i;
}
// 切片
let qiepian = test.slice(245,256);
console.log(qiepian[0])  //245
console.log(qiepian)  //<Buffer f5 f6 f7 f8 f9 fa fb fc fd fe ff>

● 拷贝

         Buffer对象.copy(目标缓冲区,目标缓冲区的起始位置,源缓冲区的起始位置,源缓冲区的结束位置)

// 创建Buffer对象实例test1
let test1 = new Buffer(10);
// 遍历每个字节,写入内容
for(let i=0;i<test1.length;i++){
    test1[i] = i;
}
// 创建Buffer对象实例test2
let test2 = new Buffer(5);
// 拷贝 将test1实例的5-10号成员拷贝到test2实例从0开始的区域
test1.copy(test2,0,5,10)
console.log(test2)  //<Buffer 05 06 07 08 09>

● Buffer与字符串之间互换

        Buffer与字符串之间互换需要指定编码格式,目前支持的编码格式如下:

        ascii、utf8、utf16le、ucs2、base64、hex

与二进制数组的区别

        二进制数组根据类型不同其值范围也不同,例如:

        Int8Array:-128~127;Int16Array:-32768~32767;

        Uint8Array:0~25;UInt16Array:0~65535

        Buffer类是基于Uint8Array的,故其值为0~255的整数数组

Buffer类

        Buffer提供如下API创建Buffer类:

● Buffer.alloc(size[,fill[,encoding]])

        返回指定大小的Buffer实例,fill代表填充值,不设置默认填充0

// 创建一个长度为5,用0填充的Buffer
let buf1 = Buffer.alloc(5);  //<Buffer 00 00 00 00 00>
// 创建一个长度为5,用0x2填充的Buffer
let buf2 = Buffer.alloc(5,2) //<Buffer 02 02 02 02 02>

● Buffer.allocUnsafe(size)

        返回指定大小的Buffer实例,但是不会被初始化。该方法调用速度快于Buffer.alloc(),但返回的实例可能包含旧数据,故需要使用fill()或write()重写

//创建一个长度为5,未初始化的Buffer
let buf3 = Buffer.allocUnsafe(5)  //<Buffer 00 00 00 00 00>

● Buffer.from()

        当括号内传递一个array,返回一个被array的值初始化的新Buffer实例

        当括号内传递一个字符串,返回一个被string的值初始化的新Buffer实例

        当括号内传递一个Buffer实例,复制传入的Buffer实例的数据并返回一个新Buffer实例

// 创建一个包含[0x1,0x3,0x5]的Buffer
let buf4 = Buffer.from([1,3,5])  //<Buffer 01 03 05>
console.log(buf4)
//创建一个被字符串初始化的Buffer
let buf5 = Buffer.from('123abc')  //<Buffer 31 32 33 61 62 63>
console.log(buf5)
//拷贝
let buf6 = Buffer.from(buf5)  //<Buffer 31 32 33 61 62 63>
console.log(buf6)

Buffer常用方法

写入缓冲区

语法:buf.write(string[, offset[, length]][, encoding])

        string:写入缓冲区的字符串

        offset:缓冲区开始写入的索引值,默认为0

        length:写入的字节数,默认为buffer.length

        encoding:使用编码,默认utf8

若buffer空间小于字符串长度,则仅写入部分字符串

        示例:

// buffer空间足够
let buf1 = Buffer.alloc(256);
let w1 = buf1.write("string 123")  //写入字节数10(包含空格)
// buffer空间不足,仅写入部分字符串
let buf2 = Buffer.alloc(5);
let w2 = buf2.write("string 123")  //写入字节数5

缓冲区读取数据

语法:buf.toString([encoding[, start[, end]]])

        encoding:使用编码,默认utf8

        start:开始读取的索引位置,默认0

        end:读取结束位置,默认缓冲区末尾

        示例:

let buf1 = Buffer.alloc(26);
for(let i=0;i<26;i++){
    buf1[i] = i + 97;
}
console.log(buf1.toString('ascii'))  //abcdefghijklmnopqrstuvwxyz
console.log(buf1.toString('utf8'))   //abcdefghijklmnopqrstuvwxyz
console.log(buf1.toString('utf8',5,10)) //fghij
console.log(buf1.toString(undefined,5,10)) //fghij

Buffer转换JSON

语法:buf.toJSON()

        示例:

let buf1 = Buffer.from([1,2,3]);
//相当于 let json1 = JSON.stringify(buf1);  //{"type":"Buffer","data":[1,2,3]}
let json1 = buf1.toJSON(buf1);  //{ type: 'Buffer', data: [ 1, 2, 3 ] }
let buf2= Buffer.from([0x1,0x2,0x3]);
let json2 = buf2.toJSON(buf2); //{ type: 'Buffer', data: [ 1, 2, 3 ] }

缓冲区合并

语法:Buffer.concat(list[, totalLength])

        list:合并的Buffer对象数组列表

        totalLength:指定合并后的Buffer对象总长度

        示例: 

let buf1 = Buffer.from('abc');
let buf2 = Buffer.from('123');
let res1 = Buffer.concat([buf1,buf2])
//限制合并长度
let res2 = Buffer.concat([buf1,buf2],4)
console.log(res1,res2)  //<Buffer 61 62 63 31 32 33> <Buffer 61 62 63 31>
console.log(res1.toString(),res2.toString())  //abc123 abc1

缓冲区比较

语法:buf.compare(otherBuffer);

        otherBuffer表示与buf对象比较的另一个Buffer对象

        buf < otherBuffer 输出 -1

        buf > otherBuffer 输出 1

        buf = otherBuffer 输出 0

        示例:

let buf1 = Buffer.from('abc');
let buf2 = Buffer.from('abc12');
let buf3 = Buffer.from('abc');
let res1 = buf1.compare(buf2);  //-1
let res2 = buf2.compare(buf1);  //1
let res3 = buf1.compare(buf3);  //0

拷贝缓冲区

语法:buf.copy(targetBuffer[, targetStart[, sourceStart[, sourceEnd]]])

        targetBuffe:目标缓冲区(拷贝的Buffer对象)

        targetStart:目标缓冲区起始位置

        sourceStart:源缓冲区起始位置(包括)

        sourceEnd:源缓冲区结束位置(不包括)

        示例:

let buf1 = Buffer.from('abcdefg');
let buf2 = Buffer.from('123456');
//将buf2插入到buf1指定位置上
buf2.copy(buf1,3,2,5);
console.log(buf1.toString())  //abc345g

缓冲区裁剪

语法:buf.slice([start[, end]])

        范围包括起始位置不包括结束位置

        示例:

let buf1 = Buffer.from('abcdefg');
let buf2 = buf1.slice(1,3);
console.log(buf2.toString())  //bc

缓冲区长度

语法:buf.length;

        返回Buffer对象占据内存长度

        示例·(缓冲区长度计算包括空格和其他符号):

let buf1 = Buffer.from('abcdefg');
let buf2 = Buffer.from('a b c de$fg');
console.log(buf1.length,buf2.length)   //7 11

其他Buffer模块常用方法:

Node.js Buffer(缓冲区) | 菜鸟教程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值