摘要:頂層對象中的頂層對象是中頂層對象是沒有這個概念的模塊化在中一個文件就是一個模塊每一個模塊都有自己的作用域每一個模塊都是屬于當(dāng)前作用域的而不是全局的全局的作用域但是在仍然不能使用每一個模塊都有自己的全局就會得到文件當(dāng)前的位置這就是的本身的模塊
頂層對象
js中的頂層對象是window
node中頂層對象是global 沒有window這個概念
在node中一個文件就是一個模塊 每一個模塊都有自己的作用域 每一個模塊都是屬于當(dāng)前作用域的而不是全局的 全局的作用域
var a=1; console.log(a) //1 global.a=100; console.log(a) //1 console.log(global.a) //100
但是在2.js仍然不能使用global.js
每一個模塊都有自己的全局 __filename 就會得到文件當(dāng)前的位置
這就是node 的本身的模塊化的機(jī)制
require("./1.js") 引入1.js這個模塊
在加載其他的模塊的時候
1、首先按照加載的模塊文件名稱進(jìn)行查找
2、如果沒有找到 在模塊文件名稱后邊加上.js 進(jìn)行查找
3、如果還沒有找到 在模塊文件名稱后邊加上.json 進(jìn)行查找
4、如果還沒有找到 在模塊文件名稱后邊加上.node 進(jìn)行查找 如果還沒有找到就會報錯
在一個模塊中通過var定義的變量 其作用域范圍是當(dāng)前模塊 外部模塊是不能夠直接訪問這個變量 如果我們想讓在外邊去訪問這個模塊變量 可以使用
1、全局掛載的方式 把這個變量作為global的屬性
1.js中
global.a=1;
2.js中
require("./1.js") console.log(__filename) console.log(a) //1 訪問到了1.js中的a的值
就可以訪問到global.a
但是這樣的做法是不推介的
2、使用模塊對象 module對象 每一個模塊都會有這個module對象
module對象 保存提供和當(dāng)前模塊有關(guān)的一些信息 訪問這個對象可以得到以下的信息
id: ".", 當(dāng)前模塊的唯一標(biāo)識
exports: {}, 通過這個對象 將一個模塊中的局部變量暴露出來
parent: null,
filename: "G:gitworkspace
ode2.js",
loaded: false,
children:
[ Module {
id: "G:gitworkspace ode1.js", exports: {}, parent: [Circular], filename: "G:gitworkspace ode1.js", loaded: true, children: [], paths: [Object] } ],
paths:
[ "G:gitworkspace
ode
ode_modules",
"G:gitworkspace ode_modules", "G: ode_modules" ] }
在這個module有一個很重要的子對象 exports 對象 可以通過這個對象將模塊中的局部對象暴露
1.js
var a=1; module.exports.a=a;
2.js
var m1=require("./1.js") console.log(m1.a) //就可以輸出1了
在模塊作用域內(nèi) 還有一個內(nèi)置的模塊對象 全局的exports 其實就是module.exports
console.log(exports===module.exports) //true
但是在使用的過程中需要注意小細(xì)節(jié) 不要讓module.exports的引用斷開
1.js中
var a=1; module.exports=[1,2,3]; //斷開了module.exports的引用 exports.a=a;
2.js中
var m1=require("./1.js") //require的返回對象就是1.js模塊中的module console.log(m1.a) //undefined 這里就訪問不到了a console.log(exports===module.exports)
同時在模塊作用域內(nèi),還有一個內(nèi)置的模塊對象,exports 他其實就是module.exports 如上
所以在使用模塊化的時候 盡量是在module.exports或者exports添加屬性 而不是具體的更改引用地址
每一個模塊作用域下邊都有這樣的一個屬性 代表的是這個文件所在目錄的路徑 蛋撻不是全局的屬性 只是模塊作用域的一個固有的屬性
__dirname返回的是當(dāng)前文件解析后的絕對路徑 不帶文件本身 也是模塊的固定屬性不是global的屬性
setInterval函數(shù) clearInterval()
setTimeout函數(shù) clearTimeout() 這四個函數(shù)都可以使用
是global對象的屬性 通過對process對象的訪問 可以得到訪問當(dāng)前的進(jìn)程 使我們可以對當(dāng)前運行的程序的進(jìn)程進(jìn)行訪問和控制 process對象有如下的屬性
stdin stdout 標(biāo)準(zhǔn)輸入輸出流 默認(rèn)情況輸入流是關(guān)閉的 所以使用的時候先開啟
標(biāo)準(zhǔn)輸入設(shè)備:鍵盤 鼠標(biāo) 攝像頭 掃描儀
process.stdin.resume(); process.stdin.on("data",function (data) { process.stdout.write(data) })
實現(xiàn)了 用戶輸入什么 回車的時候就會輸出什么
標(biāo)準(zhǔn)輸出設(shè)備:顯示器 繪圖儀
想控制太輸出 process.stdout.write("sas")
1、argv
數(shù)組 包含命令行參數(shù)的數(shù)組
會輸出
[ "C:Program Files
odejs
ode.exe", //運行改程序的編譯器
"G:gitworkspace
ode2.js" ] //當(dāng)前的.js文件
2、env
會得道用戶的運行環(huán)境 所以這里也可以看出js操作的是瀏覽器 node操作的是系統(tǒng)
3、version
返回node的版本
4、pid
返回當(dāng)前進(jìn)程的pid
5、title
返回當(dāng)前進(jìn)程顯示的名稱
6、platform
返回操作平臺的信息
7、exit()
退出這個進(jìn)程
一個用于更好的操作二進(jìn)制數(shù)據(jù)的類 從文件或輸入流中讀取內(nèi)容
使用方法
1、 var buffer=new Buffer(10) //創(chuàng)建一個buffer對象 并為這個對象分配一個大小
當(dāng)我們一個buffer分配空間以后 其長度是固定的 不能更改
2、使用數(shù)組來新建一個buffer var bb=new Buffer([1,2,3])
這種方式聲明的buffer的長度也是固定的
3、使用字符串聲明一個buffer var ss=new Buffer(string,"utf-8");
把字符串轉(zhuǎn)化為二進(jìn)制格式的
將16進(jìn)制的編碼轉(zhuǎn)化為字符 String.fromCharCode()
buffer的方法
1、buffer的write方法
var ss=new Buffer("sasasa"); for(var i=0;ibuffer.write(string,[offset] )作用是根據(jù)參數(shù)offset來指定開始添加字符串的
var ss="miaov" var bf=new Buffer(5); bf.write(ss) console.log(bf) //但是指定了offset以后
var ss="miaov" var bf=new Buffer(5); bf.write(ss,2) console.log(bf) //2、buffer.toString() 方法 將buffer轉(zhuǎn)換成字符串
var ss="miaov" var bf=new Buffer(5); bf.write(ss) console.log(bf.toString()) //miaovvar ss="妙味" var bf=new Buffer(ss); console.log(bf) //所以在node中一個漢字占3個字節(jié)
文件系統(tǒng) File System
3、buffer.tojson()
將buffer中的內(nèi)容轉(zhuǎn)化為json格式數(shù)據(jù)
4、buffer.slice(start,end)
截取buffer中的一部分 但是和原來的老的buffer引用的是一個地址 改變這個新的buffer就會改變原來的5、5、buffer.copy(復(fù)制內(nèi)容到的新區(qū)域)
但是這個新區(qū)域的引用地址和原來的地址不是同一個地址 所以更改新的區(qū)域不會更改原來的buffer
6、buffer的靜態(tài)方法 不需要在實例上邊調(diào)用的方法
檢測 Buffer是否支持某種編碼 Buffer.isEncoding("utf-8") 檢測是否支持utf-8編碼
檢測 某個變量是否是Buffer Buffer.isBuffer(變量)
Buffer.concat(存著buffer的數(shù)組) 返回這個數(shù)組內(nèi)每一個元素拼接好的buffer首先要引入 fs模塊
1、fs.open方法 異步的方式打開文件 不會阻塞后邊代碼的執(zhí)行 通過回調(diào)函數(shù)對讀取結(jié)果進(jìn)行處理
fs.open(path,flags,[model],callback)
path 所在的路徑
flags 打開文件的方式 r讀的方式 r+讀寫方式
model 設(shè)置文件的模式 讀/寫/執(zhí)行 4/2/1
callback 當(dāng)通過open方法以后 調(diào)用callback 有兩個參數(shù) error fd(文件的標(biāo)識)
文件的標(biāo)識是唯一的標(biāo)識這個文件 以便于后邊通過這個編號來操作這個打開的文件 從3開始
2、fs.openSync(path,flags) 會阻塞后邊代碼的執(zhí)行 通過這個方法返回值對讀取結(jié)果進(jìn)行處理
3、fs.read(fd,buffer,offset,length,position,callback)fs.open("1.txt","r",function (error,fd) { if(error){ console.log("文件打開失敗") } //fs.read(fd,buffer,offset,length,position,callback) //剛才讀取成功的文件的唯一標(biāo)識fd var bf1=new Buffer(10); //offset 新的內(nèi)容添加到的buffer的起始位置 //length 讀取的長度 //position 從文件的哪里開始 //callback 回調(diào)函數(shù) 的參數(shù)error newbf的length newbf新的buffer fs.read(fd,bf1,0,4,null,function (error,len,newbf) { console.log(error) //null console.log(len) //4 console.log(newbf) //}) }) 4、fs.writeSync() fs的同步版本
5、fs.write(fd,buffer,offset,length,position,callback)buffer 要寫入的數(shù)據(jù) offset buffer對象中要寫入的數(shù)據(jù)起始位置 length buffer對象中要寫入的數(shù)據(jù)的長度 position fd中的起始位置 文件中開始寫的位置 callback 回調(diào)函數(shù) error buffer的length 寫入的bufferfs.write另一種使用方法 fs.write(fd,"wqds找室內(nèi)設(shè)計師",5,"utf-8")
fs.open("1.txt","w",function (error,fd) { if(error){ console.log("文件打開失敗") } else{ var bf=new Buffer("123"); fs.write(fd,bf,0,3,0,function (error,length) { console.log(arguments) }) } })6、fs.writeSync() buffer的同步的版本
7、fs.close(fd,callback) 文件打開以后 一定要對文件進(jìn)行關(guān)閉
以上方法都是在文件打開以才能執(zhí)行的 下面這些方法自帶打開文件的方法
8、fs.writeFile(filename,data,[options],callback) 如果文件不存在就回新建一個文件 而不會報錯
如果文件存在 則新的data會直接覆蓋原有的內(nèi)容var fileName="2.txt"; fs.writeFile(fileName,"sasa",function () { })以上的方法就會新建一個2.txt
9、fs.writeFileSync(filename,data,[options]) 同步版本
10、fs.appendFile(filename,data,callback) 異步的向文件寫入數(shù)據(jù)
如果文件不存在就回新建一個文件 而不會報錯
如果文件存在 則新的data會追加到原有的內(nèi)容后邊
當(dāng)然也有同步版本
11、fs.exists(path,callback) 檢查指定的目錄是否存在 當(dāng)然也有同步版本
12、fs.readFile(fileName,callback)
如果直接輸出data 會得到的是一個bufferfs.readFile("1.txt",function (error,data) { if(error){ console.log("讀取失敗") } else{ console.log(data.toString()) } })當(dāng)然也有同步的版本
13、fs.unlink(fileName,callback) 刪除這個文件var fileName="2.txt"; fs.unlink(fileName,function (error) { if(error){ console.log(error) } })就會刪除2.txt
node實現(xiàn)web開發(fā)-->http模塊
13、fs.rename(fileName,newName,callback)
14、fs.sat(filename,callback) 會在callback中得到文件的信息
15、fs.mkdir(path,[mode],callback) 創(chuàng)建文件夾
16、fs.rmdir(path,callback) 刪除文件夾客戶端發(fā)送一個http請求到指定的服務(wù)器端->服務(wù)器端接受并處理請求->返回數(shù)據(jù)到客戶端
使用http模塊就可以搭建一個web服務(wù)器
1、這個模塊下有一個createServer(回調(diào)函數(shù))來創(chuàng)建一個服務(wù)器
2、服務(wù)器調(diào)用.listen(端口號,[主機(jī)名],[callback]) 來實現(xiàn)監(jiān)聽某一窗口
3、server.on(error,callback) 當(dāng)服務(wù)器開啟發(fā)生錯誤了 就會觸發(fā)這個事件
5、server.on("listening",callback) 當(dāng)服務(wù)器正式監(jiān)聽的時候就會觸發(fā)這個事件
6、server.on("request",callback) 當(dāng)有客戶端發(fā)起請求的時候 就會觸發(fā)這個事件
request
這個里邊有一個對象IncomingMessage 包含以下的信息
得到客戶端發(fā)送過來的信息 url method
response
res.write(data)
res.end() 服務(wù)器的響應(yīng)已經(jīng)發(fā)送完成了 必須調(diào)用
res.writeHead(狀態(tài)碼,描述,頭信息) 設(shè)置頭信息
頭信息:{‘content-type’:"text/html;charset=utf-8"}text/html 按照html處理 text/plain 告訴客戶端按照文本處理當(dāng)然如果不希望寫在頭信息 這一部分的話 也就是上邊的那個鍵值對里邊
url的處理
也可以調(diào)用 res.setHeader(key,value)通過req得到url req.url
在url中 ?后面的內(nèi)容叫做查詢字符串
在node中有專門處理url的模塊 引入url模塊var http=require("http"); var url=require("url"); var server=http.createServer(function (req,res) { var urlString=url.parse(req.url); console.log(urlString) res.write("sasa"); res.end(); }) server.listen(3000);在這個urlString中包 協(xié)議 主機(jī) 端口
hash 哈希值部分#后面的內(nèi)容 search ?+后面的內(nèi)容 query ?后面的內(nèi)容
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/88844.html
摘要:二叉搜索樹是二叉樹的一種,其特征是左側(cè)子節(jié)點存儲比父節(jié)點小的值,右側(cè)子節(jié)點存儲比父節(jié)點大或等于父節(jié)點的值。實現(xiàn)和這個兩個方法其實挺簡單的,最小的節(jié)點就在二叉搜索樹的最左反之,最大的就在最右。 本系列所有文章:第一篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之棧與隊列第二篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之鏈表第三篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之集合第四篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之字典和散列表第五篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)...
摘要:像剛才的這幅圖,就是二叉搜索樹。而我們本文要學(xué)習(xí)的內(nèi)容,就是如何寫一個二叉搜索樹。但在二叉搜索樹中,我們把節(jié)點成為鍵,這是術(shù)語。前端路漫漫,且行且歌的前端樂園原文鏈接寒假前端學(xué)習(xí)學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法四二叉搜索樹 本系列的第一篇文章: 學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)與算法(一),棧與隊列第二篇文章:學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)與算法(二):鏈表第三篇文章:學(xué)習(xí)JavaScript數(shù)據(jù)...
摘要:感謝大神的免費的計算機(jī)編程類中文書籍收錄并推薦地址,以后在倉庫里更新地址,聲音版全文狼叔如何正確的學(xué)習(xí)簡介現(xiàn)在,越來越多的科技公司和開發(fā)者開始使用開發(fā)各種應(yīng)用。 說明 2017-12-14 我發(fā)了一篇文章《沒用過Node.js,就別瞎逼逼》是因為有人在知乎上黑Node.js。那篇文章的反響還是相當(dāng)不錯的,甚至連著名的hax賀老都很認(rèn)同,下班時讀那篇文章,竟然坐車的還坐過站了。大家可以很...
摘要:感謝大神的免費的計算機(jī)編程類中文書籍收錄并推薦地址,以后在倉庫里更新地址,聲音版全文狼叔如何正確的學(xué)習(xí)簡介現(xiàn)在,越來越多的科技公司和開發(fā)者開始使用開發(fā)各種應(yīng)用。 說明 2017-12-14 我發(fā)了一篇文章《沒用過Node.js,就別瞎逼逼》是因為有人在知乎上黑Node.js。那篇文章的反響還是相當(dāng)不錯的,甚至連著名的hax賀老都很認(rèn)同,下班時讀那篇文章,竟然坐車的還坐過站了。大家可以很...
閱讀 893·2021-11-23 09:51
閱讀 1107·2021-11-15 17:57
閱讀 1674·2021-09-22 15:24
閱讀 820·2021-09-07 09:59
閱讀 2234·2019-08-29 15:10
閱讀 1857·2019-08-29 12:47
閱讀 760·2019-08-29 12:30
閱讀 3381·2019-08-26 13:51