我的NodeJs學(xué)習(xí)小結(jié)(一)
這第一篇就談?wù)凬odeJs的一些編程細(xì)節(jié)吧。
1、遍歷數(shù)組
for (var i=0, l=arr.length; i<l; i++)
這樣寫的一個好處就是讓每次循環(huán)少一步獲取數(shù)組對象長度的操作,數(shù)組長度越長,價值越明顯。
2、判斷變量的真假
if (a) {...} //a='', a='0', a=[], a={}
if條件判斷的結(jié)果分別是:false, true, true, true。這個結(jié)果和PHP的結(jié)果是不同的,不要混淆。還需要區(qū)分它和非恒等判斷相似的情況。
3、0值非恒等判斷
1 if (0 == '0') {...} //true
2 if (0 == []) {...} //true
3 if (0 == [0]) {...} //true
4 if (0 == {}) {...} //false
5 if (0 == null) {...} //false
6 if (0 == undefined) {...} //false
其實(shí)還有很多這種詭異的判斷,我只列出了較為常見的。如果想弄明白其中的規(guī)則,請參閱我的另一篇博文:【JavaScript】深入分析JavaScript的關(guān)系運(yùn)算和if語句。
4、parseInt的陷阱
var n = parseInt(s); //s='010'
該語句執(zhí)行后n值為8,而不是10。雖然很多人知道這一點(diǎn),但是編程中難免會出錯,我深有體會。所以,最好按下面的方式來寫,就不會出錯了。
var n = parseInt(s, 10);
5、變量在使用前一定要先聲明
雖然,直接使用變量而不聲明也不會出錯,但是,這樣寫是很容易出錯的。因為解釋器會把它解釋成全局變量,很容易和其他全局變量重名而導(dǎo)致出錯。所以,一定要養(yǎng)成變量使用前要先聲明的好習(xí)慣。
6、循環(huán)中存在異步的情況
for (var i=0, l=arr.length; i<l; i++) {
var sql = "select * from nx_user";
db.query(sql, function(){
sys.log(i + ': ' + sql);
}); //db.query為表查詢操作,是異步操作
}
你會發(fā)現(xiàn),輸出的結(jié)果都是相同的,而且是當(dāng)i=arr.length-1時的輸出內(nèi)容。因為JavaScript是單線程的,它會先執(zhí)行完整個循環(huán)的同步內(nèi)容之后,才去執(zhí)行其中的異步操作。代碼中的匿名回調(diào)函數(shù)就是一個異步回調(diào)。執(zhí)行到該函數(shù)的時候,for循環(huán)以及后面的一些同步操作都已經(jīng)執(zhí)行完畢。出于閉包原則,該函數(shù)會保留for循環(huán)的最后一次循環(huán)的sql變量和i變量的內(nèi)容,所以才會導(dǎo)致錯誤的結(jié)果。
那怎么辦呢?解決方法有兩種,一種是使用立即函數(shù),如下:
for (var i=0, l=arr.length; i<l; i++) {
var sql = "select * from nx_user";
(function(sql, i){
db.query(sql, function(){
sys.log(i + ': ' + sql);
}); //db.query為表查詢操作,是異步操作
})(sql, i);
}
還有一種方法是將異步操作部分提取出來,單寫一個函數(shù),如下:
var outputSQL = function(sql, i){
db.query(sql, function(){
sys.log(i + ': ' + sql);
}); //db.query為表查詢操作,是異步操作
}
for (var i=0, l=arr.length; i<l; i++) {
var sql = "select * from nx_user";
outputSQL(sql, i);
}
7 、在對大量數(shù)據(jù)作處理時,盡量避免循環(huán)嵌套。
因為循環(huán)嵌套的處理時間會隨著數(shù)據(jù)量的增加成指數(shù)級增長,所以應(yīng)盡量避免。遇到這種情況,如果沒有更好的辦法,一般采取的策略是以空間換時間,即建立一張二級循環(huán)數(shù)據(jù)的Hash映射表。當(dāng)然,還要具體情況具體分析。還有一點(diǎn)要說的是,某些方法本身就是一個循環(huán)體,如Array.sort()(該方法應(yīng)該是用了兩層循環(huán)實(shí)現(xiàn)),在使用的時候需加注意。
8、盡量避免遞歸調(diào)用。
遞歸調(diào)用的優(yōu)點(diǎn)是代碼簡潔,實(shí)現(xiàn)簡單,而它的缺點(diǎn)很重要,說明如下:
(1)函數(shù)棧的大小會隨著遞歸層次成線性增長,而函數(shù)棧是有上限值的,當(dāng)遞歸達(dá)到一定層數(shù)后函數(shù)棧就會溢出,從而導(dǎo)致程序出錯;
(2)每遞歸一層都會增加額外的壓棧和出棧操作,即函數(shù)調(diào)用過程中的保存現(xiàn)場和恢復(fù)現(xiàn)場。
所以,應(yīng)盡量避免遞歸調(diào)用。
9、關(guān)于模塊文件的作用域隔離。
Node在編譯JavaScript模塊文件的時候,已經(jīng)對其內(nèi)容進(jìn)行了頭尾包裝,如下:
(function(exports, require, module, __filename, __dirname){
你的JavaScript文件代碼
});
從而使每個模塊文件之間進(jìn)行了作用域隔離。所以,當(dāng)你編寫NodeJs模塊文件的時候,不需要自己再加一層作用域隔離封裝了。如下面的代碼格式,只會額外增加一層函數(shù)調(diào)用,是不推薦的:
(function(){
... ...
})();
10、數(shù)組和對象不要混用
下面是錯誤代碼的示例:
var o = []; o['name'] = 'LiMing';
數(shù)組和對象混用可能會導(dǎo)致不可預(yù)知的錯誤。我的一個同事就遇到過一個很奇怪的問題,先看代碼:
var o = []; o['name'] = 'LiMing'; var s = JSON.stringify(o);
他本以為對象o的name屬性會在JSON串中,結(jié)果就是沒有。當(dāng)時我也很奇怪,但我有預(yù)感到是數(shù)組和對象混用的問題,試了一下,果然是它的問題。后來我在ECMA規(guī)范中查到,數(shù)組在序列化時是按JA規(guī)則進(jìn)行的。所以,要養(yǎng)成一個好的編程習(xí)慣,正確使用數(shù)組和對象,不要混用。
11、promise優(yōu)雅編程
相信接觸過nodeJs的人都有過這樣的體驗,當(dāng)異步回調(diào)里嵌套異步回調(diào)的時候,代碼就顯得很混亂,缺乏易讀性。nodeJs的這一窘境可以借助promise來克服。promise就像一個雕琢器,讓你的代碼變得優(yōu)雅、美觀。promise有個A+規(guī)范,網(wǎng)上有幾種實(shí)現(xiàn)方式,可以參閱。
- 利用NodeJS和PhantomJS抓取網(wǎng)站頁面信息以及網(wǎng)站截圖
- nodejs文件操作模塊FS(File System)常用函數(shù)簡明總結(jié)
- nodejs npm install全局安裝和本地安裝的區(qū)別
- nodejs npm包管理的配置方法及常用命令介紹
- nodejs的10個性能優(yōu)化技巧
- 拋棄Nginx使用nodejs做反向代理服務(wù)器
- 使用Nodejs開發(fā)微信公眾號后臺服務(wù)實(shí)例
- nodejs開發(fā)環(huán)境配置與使用
- nodejs教程之入門
- nodejs教程之環(huán)境安裝及運(yùn)行
- NodeJs基本語法和類型
相關(guān)文章
Node環(huán)境中JS代碼缺少window對象的原因和解決方案
你可能會在某些情況下需要在Node環(huán)境下運(yùn)行JavaScript代碼,但你也可能會遇到一個常見的問題:缺少window環(huán)境,在本文中,我們將深入探討這個問題的原因,并提供解決方案,需要的朋友可以參考下2023-08-08
Node.js中的async?和?await?關(guān)鍵字微任務(wù)和宏任務(wù)
這篇文章主要介紹了Node.js中的async和await關(guān)鍵字微任務(wù)和宏任務(wù),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-07-07
node.js(express)中使用Jcrop進(jìn)行圖片剪切上傳功能
最近在項目開發(fā)中遇到了這樣的需求就是要實(shí)現(xiàn)用戶上傳頭像,并且要保存用戶裁切后的部分作為用戶頭像。下面給大家分享node.js(express)中使用Jcrop進(jìn)行圖片剪切上傳功能,需要的的朋友參考下吧2017-04-04
mac安裝nvm(node.js)多版本管理實(shí)踐步驟
這篇文章主要介紹了mac安裝nvm(node.js)多版本管理的相關(guān)資料,NVM是一個用于管理多個Node.js版本的命令行工具,它允許開發(fā)者在同一臺機(jī)器上安裝、切換和卸載不同版本的Node.js,從而解決版本不兼容的問題,需要的朋友可以參考下2025-02-02
基于nodejs+express(4.x+)實(shí)現(xiàn)文件上傳功能
通過一段時間的查閱資料發(fā)現(xiàn)實(shí)現(xiàn)上傳的方式有:1.express中間件multer模塊2.connect-multiparty模塊(但現(xiàn)在 官方不推薦 )3.使用multiparty模塊實(shí)現(xiàn)4.使用formidable插件實(shí)現(xiàn),本文給大家介紹nodejs+express(4.x+)實(shí)現(xiàn)文件上傳功能,需要的朋友參考下2015-11-11

