node模塊
文件模塊
內(nèi)置模塊
第三方模塊
內(nèi)置模塊
util
util.inherits(Child,Parent)
繼承胡桨,原理es6的繼承方法:Object.setPrototypeOf(Child.prototype,Parent.prototype);只繼承公有方法
var util = require('util');
util.inherits();
Buffer
Buffer詳解
Buffer是global上的屬性迈勋,為全局對象
常用全局屬性: setTimeout setInterval process setImmediate console Buffer 形參(exports,require,module,__dirname , __filename)
Buffer展現(xiàn)給我們的是16進制,utf8一個漢字 代表3個字節(jié)指煎,一個字節(jié)由八個位組成Bit
- buffer創(chuàng)建
三種方式(固定大小): 長度創(chuàng)建 字符串創(chuàng)建 數(shù)組創(chuàng)建
var buffer = new Buffer(6)//6個字節(jié)
buffer.fill(257);//257對256取模
console.log(buffer);//<Buffer 01 01 01 01 01 01 >//6字節(jié) 沒有fill則隨機
var buffer = new Buffer('開心');
console.log(buffer);//
var buffer = new Buffer([100,120,16]);
console.log(buffer);//<Buffer 64 78 f0>
var buffer = new Buffer([0xfe,0xff,0x16]);
console.log(buffer);//<Buffer fe ff 16>
- buffer里存儲的是內(nèi)存地址
buffer類似于數(shù)組:
var obj = {name:1};
var arr = [obj,1,2];
var newArr = arr.slice(0);
obj.name = 2;
console.log(newArr);//[{name:2},1,2]
buffer:存儲的都是內(nèi)存地址
var buffer = new Buffer([1,2,3]);
var newBuffer = buffer.slice(0,1);
newBuffer[0]=2;
console.log(buffer)//<Buffer 02 02 03>
- buffer的write方法
//參數(shù):string,往里面寫的字符串 offset,偏移量 length,寫入的長度 encoding 默認(rèn)是utf8
var buffer = new Buffer(12);
buffer.write('珠峰',0,6);
buffer.write('培訓(xùn)',6,6);
console.log(buffer.toString())//珠峰培訓(xùn)
buffer.forEach(function (item){
console.log(item)//得到的是十進制
});
buffer的copy方法 將小buffer拷貝到大buffer
//參數(shù):targetBuffer,目標(biāo)buffer targetStart,目標(biāo)的開始 sourceStart,源的開始
var buffer = new Buffer(12);
var buf1 = new Buffer('珠峰');
var buf2 = new Buffer('培訓(xùn)');
buf1.copy(buffer,0);
buf2.copy(buffer,6);
console.log(buffer.toString());//Buffer的concat方法
//參數(shù):list,totalLength
var buf1 = new Buffer('珠峰');
var buf2 = new Buffer('培訓(xùn)');
console.log(Buffer.concat([buf1,buf2],1000).toString);//長度1000,多的補零
原理是利用copy方法,下面我們自己模擬一個concat方法:
//1.判斷長度是否傳遞便斥,如果給了長度就構(gòu)建一個buffer,將小buffer依次拷貝到大buffer上至壤,過長則將多余的部分 截取掉slice()截取有效長度
//2.手動維護長度 在構(gòu)建buffer,將小buffer依次拷貝到大buffer上 copy
Buffer.myConcat = function (list,totalLength) {
//1.判斷長度是否傳遞
if(typeof totalLength == "undefined"){
totalLength = 0;
list.forEach(function (item) {
totalLength += item.length;
});
}
var buffer = new Buffer(totalLength);//1000
var index = 0;
list.forEach(function (item) {
item.copy(buffer,index);
index+= item.length;
});
return buffer.slice(0,index);
};
console.log(Buffer.concat([buf1,buf2,buf1,buf2]).toString());
進制轉(zhuǎn)換
- parseInt 任意進制轉(zhuǎn)10進制
parseInt('11100011',2);//
- toString 任意進制轉(zhuǎn)任意進制
(0x16).toString(10);//16轉(zhuǎn)10枢纠,結(jié)果26
- base64
base64不是一個加密算法像街,加密:md5 sha1 sha256 - 漢字轉(zhuǎn)base64 '珠' => 54+g 38=>64
2進制裝換成10進制不得大于64,得到的結(jié)果在可見編碼中取值
base64轉(zhuǎn)換原理代碼:
//將漢字轉(zhuǎn)換成2進制
var buffer = new Buffer('珠');
console.log(buffer); //0xe7 0x8f 0xa0
console.log((0xe7).toString(2)); //11100111
console.log((0x8f).toString(2)); //10001111
console.log((0xa0).toString(2)); //10100000
//將2進制轉(zhuǎn)換成10進制
console.log(parseInt('00111001',2)); //57
console.log(parseInt('00111000',2)); //56
console.log(parseInt('00111110',2)); //62
console.log(parseInt('00100000',2)); //32
//查找
var str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
str+= 'abcdefghijklmnopqrstuvwxyz';
str+='0123456789';
str+='+/';
console.log(str[57]+str[56]+str[62]+str[32]);//54+g
fs模塊 file system
十組常用的fs模塊方法
readFileSync readFile
writeFile writeFileSync
appendFile appendFileSync
path.resolve() path.join() 給一個相對路徑 解析一個絕對路徑
mkdirSync mkdir 創(chuàng)建目錄
rmdirSync rmdir 刪除目錄
unlinkSync unlink 刪除文件
readdirSync readdir 讀取目錄
existsSync exists 是否存在
statSync stat 判斷文件狀態(tài)
const fs = require('fs');
能用異步絕不用同步
fs.readFileSync
讀取文件不存在會報錯
讀取默認(rèn)格式是buffer類型 相當(dāng)于encoding:null
- readFileSync 同步讀取
var result = fs.readFileSync('./1.txt,'utf8') - readFile 異步讀取
fs.readFile('./1.txt,'utf8',function(error,data){
if(error)console.log(error);
console.log(data);
});
解決異步問題:
var school = {};
fs.readFile('./name.txt','utf8',function (e,data) { //error-first
if(e)console.log(e);
school.name = data;
out();
});
fs.readFile('./age.txt','utf8',function (e,data) { //error-first
if(e)console.log(e);
school.age = data;
out();
});
function out() {
if(Object.keys(school).length == 2){
console.log(school); //{name:'珠峰培訓(xùn)',age:8}
}
}
- write
1如果寫的文件不存在,會創(chuàng)建文件
2默認(rèn)寫入的格式是utf8
3文件有內(nèi)容晋渺,原來的內(nèi)容會被覆蓋
fs.writeFileSync('./a.txt',new Buffer('珠峰'));//寫入的是'珠峰',因為默認(rèn)是utf8格式镰绎,會默認(rèn)toString('utf8')
- write async
fs.writeFile('./a.txt',new Buffer('珠峰'),function(err){});
不覆蓋寫入2中方法:
fs.appendfile(target,data,,function (err) {})
fs.writeFile(target,data,{encoding:'utf8',flag:'a'},function (err) {});
- path.resolve path.join
var path = require('path');
console.log(path.resolve('1.js'));//以當(dāng)前路徑解析出一個相對路徑
console.log(path.join(__dirname,'1.js'));//相當(dāng)于resolve
- 兩個函數(shù)模擬:copy copyAsync
function copy(source,target) {//異步
//先讀在寫
fs.readFile(source,function (err,data) {
if(err)console.log(err);
//appendFile可以進行累加,不清空內(nèi)容寫入
fs.writeFile(target,data,{encoding:'utf8',flag:'a'},function (err) {
if(err)console.log(err);
console.log('拷貝成功');
});
});
}
copy('./name.txt','./name1.txt');
function copySync(source,target) { //同步
var result = fs.readFileSync(source);
fs.writeFileSync(target,result);
}
copySync('./name.txt','./name1.txt');
- mkdirSync和mkdir
創(chuàng)建目錄
函數(shù)模擬些举,內(nèi)置的方法不能一次創(chuàng)建多級目錄跟狱,
函數(shù)模擬:同步創(chuàng)建文件夾
function makepSync(p) {
var arr = p.split('/');
for(var i = 0;i<arr.length;i++){
var path = arr.slice(0,i+1).join('/');
if(!fs.existsSync(path)){//exists兩個值true false
fs.mkdirSync(path)
}
}
}
makep('a/b/c/d/e/f')
函數(shù)模擬:異步創(chuàng)建文件夾
//寫一個異步創(chuàng)建 mkdir + exists
//遞歸 mkdir + exists 插入排序
function makep(p) {
var paths = p.split('/');
var index = 1;
function makeOne(subpath) {
if(paths.length == index-1){
return;
}
fs.exists(subpath,function (flag) {
var temp = paths.slice(0,++index).join('/');
if(!flag){ //不存在的時候創(chuàng)建
fs.mkdir(subpath,function () {
makeOne(temp);// a/b
});
}else{ //存在的時候繼續(xù)下一次
makeOne(temp);
}
});
}
makeOne(paths[index-1]);
}
makep('a/b/c/d/e/f');