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