欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

我的NodeJs學(xué)習(xí)小結(jié)(一)

 更新時(shí)間:2014年07月06日 11:13:38   投稿:hebedich  
既然是我的技術(shù)總結(jié),那就是以我的技術(shù)水平為基礎(chǔ)的,寫(xiě)淺了大家不要笑話,如果有錯(cuò)誤的地方還望指正。

 這第一篇就談?wù)凬odeJs的一些編程細(xì)節(jié)吧。

1、遍歷數(shù)組

for (var i=0, l=arr.length; i<l; i++)

      這樣寫(xiě)的一個(gè)好處就是讓每次循環(huán)少一步獲取數(shù)組對(duì)象長(zhǎng)度的操作,數(shù)組長(zhǎng)度越長(zhǎng),價(jià)值越明顯。

2、判斷變量的真假

if (a) {...} //a='', a='0', a=[], a={}

      if條件判斷的結(jié)果分別是:false, true, true, true。這個(gè)結(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í)還有很多這種詭異的判斷,我只列出了較為常見(jiàn)的。如果想弄明白其中的規(guī)則,請(qǐng)參閱我的另一篇博文:【JavaScript】深入分析JavaScript的關(guān)系運(yùn)算和if語(yǔ)句。

4、parseInt的陷阱

var n = parseInt(s); //s='010'

        該語(yǔ)句執(zhí)行后n值為8,而不是10。雖然很多人知道這一點(diǎn),但是編程中難免會(huì)出錯(cuò),我深有體會(huì)。所以,最好按下面的方式來(lái)寫(xiě),就不會(huì)出錯(cuò)了。

var n = parseInt(s, 10);

5、變量在使用前一定要先聲明

      雖然,直接使用變量而不聲明也不會(huì)出錯(cuò),但是,這樣寫(xiě)是很容易出錯(cuò)的。因?yàn)榻忉屍鲿?huì)把它解釋成全局變量,很容易和其他全局變量重名而導(dǎo)致出錯(cuò)。所以,一定要養(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為表查詢操作,是異步操作
}

      你會(huì)發(fā)現(xiàn),輸出的結(jié)果都是相同的,而且是當(dāng)i=arr.length-1時(shí)的輸出內(nèi)容。因?yàn)镴avaScript是單線程的,它會(huì)先執(zhí)行完整個(gè)循環(huán)的同步內(nèi)容之后,才去執(zhí)行其中的異步操作。代碼中的匿名回調(diào)函數(shù)就是一個(gè)異步回調(diào)。執(zhí)行到該函數(shù)的時(shí)候,for循環(huán)以及后面的一些同步操作都已經(jīng)執(zhí)行完畢。出于閉包原則,該函數(shù)會(huì)保留for循環(huán)的最后一次循環(huán)的sql變量和i變量的內(nèi)容,所以才會(huì)導(dǎo)致錯(cuò)誤的結(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);
}

       還有一種方法是將異步操作部分提取出來(lái),單寫(xiě)一個(gè)函數(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 、在對(duì)大量數(shù)據(jù)作處理時(shí),盡量避免循環(huán)嵌套。

      因?yàn)檠h(huán)嵌套的處理時(shí)間會(huì)隨著數(shù)據(jù)量的增加成指數(shù)級(jí)增長(zhǎng),所以應(yīng)盡量避免。遇到這種情況,如果沒(méi)有更好的辦法,一般采取的策略是以空間換時(shí)間,即建立一張二級(jí)循環(huán)數(shù)據(jù)的Hash映射表。當(dāng)然,還要具體情況具體分析。還有一點(diǎn)要說(shuō)的是,某些方法本身就是一個(gè)循環(huán)體,如Array.sort()(該方法應(yīng)該是用了兩層循環(huán)實(shí)現(xiàn)),在使用的時(shí)候需加注意。

8、盡量避免遞歸調(diào)用。

      遞歸調(diào)用的優(yōu)點(diǎn)是代碼簡(jiǎn)潔,實(shí)現(xiàn)簡(jiǎn)單,而它的缺點(diǎn)很重要,說(shuō)明如下:

      (1)函數(shù)棧的大小會(huì)隨著遞歸層次成線性增長(zhǎng),而函數(shù)棧是有上限值的,當(dāng)遞歸達(dá)到一定層數(shù)后函數(shù)棧就會(huì)溢出,從而導(dǎo)致程序出錯(cuò);

      (2)每遞歸一層都會(huì)增加額外的壓棧和出棧操作,即函數(shù)調(diào)用過(guò)程中的保存現(xiàn)場(chǎng)和恢復(fù)現(xiàn)場(chǎng)。

      所以,應(yīng)盡量避免遞歸調(diào)用。

9、關(guān)于模塊文件的作用域隔離。

      Node在編譯JavaScript模塊文件的時(shí)候,已經(jīng)對(duì)其內(nèi)容進(jìn)行了頭尾包裝,如下:

(function(exports, require, module, __filename, __dirname){
  你的JavaScript文件代碼
});

從而使每個(gè)模塊文件之間進(jìn)行了作用域隔離。所以,當(dāng)你編寫(xiě)NodeJs模塊文件的時(shí)候,不需要自己再加一層作用域隔離封裝了。如下面的代碼格式,只會(huì)額外增加一層函數(shù)調(diào)用,是不推薦的:

(function(){
  ... ...
})();

 10、數(shù)組和對(duì)象不要混用

      下面是錯(cuò)誤代碼的示例:

var o = [];
o['name'] = 'LiMing';

      數(shù)組和對(duì)象混用可能會(huì)導(dǎo)致不可預(yù)知的錯(cuò)誤。我的一個(gè)同事就遇到過(guò)一個(gè)很奇怪的問(wèn)題,先看代碼:

var o = [];
o['name'] = 'LiMing';
var s = JSON.stringify(o);

       他本以為對(duì)象o的name屬性會(huì)在JSON串中,結(jié)果就是沒(méi)有。當(dāng)時(shí)我也很奇怪,但我有預(yù)感到是數(shù)組和對(duì)象混用的問(wèn)題,試了一下,果然是它的問(wèn)題。后來(lái)我在ECMA規(guī)范中查到,數(shù)組在序列化時(shí)是按JA規(guī)則進(jìn)行的。所以,要養(yǎng)成一個(gè)好的編程習(xí)慣,正確使用數(shù)組和對(duì)象,不要混用。

11、promise優(yōu)雅編程

       相信接觸過(guò)nodeJs的人都有過(guò)這樣的體驗(yàn),當(dāng)異步回調(diào)里嵌套異步回調(diào)的時(shí)候,代碼就顯得很混亂,缺乏易讀性。nodeJs的這一窘境可以借助promise來(lái)克服。promise就像一個(gè)雕琢器,讓你的代碼變得優(yōu)雅、美觀。promise有個(gè)A+規(guī)范,網(wǎng)上有幾種實(shí)現(xiàn)方式,可以參閱。

相關(guān)文章

  • 教你如何用node連接redis的示例代碼

    教你如何用node連接redis的示例代碼

    這篇文章主要介紹了教你如何用node連接redis的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • NPM命令運(yùn)行報(bào)錯(cuò):npm?v10.2.4?is?known?not?to?run?on?Node.js?v14.21.1解決辦法

    NPM命令運(yùn)行報(bào)錯(cuò):npm?v10.2.4?is?known?not?to?run?on?Node.js

    這篇文章主要給大家介紹了關(guān)于NPM命令運(yùn)行報(bào)錯(cuò):npm?v10.2.4?is?known?not?to?run?on?Node.js?v14.21.1的解決辦法,文中將解決辦法介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • 在Ubuntu系統(tǒng)上安裝Ghost博客平臺(tái)的教程

    在Ubuntu系統(tǒng)上安裝Ghost博客平臺(tái)的教程

    這篇文章主要介紹了在Ubuntu系統(tǒng)上安裝Ghost博客平臺(tái)的教程,Ghost博客平臺(tái)以Node.js寫(xiě)成,需要的朋友可以參考下
    2015-06-06
  • nodejs提示:cross-device link not permitted, rename錯(cuò)誤的解決方法

    nodejs提示:cross-device link not permitted, rename錯(cuò)誤的解決方法

    這篇文章主要給大家介紹了關(guān)于nodejs提示:cross-device link not permitted, rename錯(cuò)誤的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用nodejs具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • npm?install?XXX安裝路徑文件夾權(quán)限問(wèn)題的解決過(guò)程

    npm?install?XXX安裝路徑文件夾權(quán)限問(wèn)題的解決過(guò)程

    這篇文章主要給大家介紹了關(guān)于npm?install?XXX安裝路徑文件夾權(quán)限問(wèn)題(npm?ERR!?The?operation?was?rejected?by?your?operating?system.errno?-4080)的解決過(guò)程,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • Node.js中路徑處理模塊path詳解

    Node.js中路徑處理模塊path詳解

    相信大家都知道在nodejs中,path是個(gè)使用頻率很高,但卻讓人又愛(ài)又恨的模塊。因?yàn)椴糠治臋n說(shuō)的不夠清晰,還有部分因?yàn)榻涌诘钠脚_(tái)差異性。本文就給大家詳細(xì)介紹下關(guān)于Node.js中的路徑處理模塊path,希望能對(duì)大家學(xué)習(xí)或者使用模塊path有所幫助,下面來(lái)一起看看吧。
    2016-11-11
  • Node.js動(dòng)手?jǐn)]一個(gè)靜態(tài)資源服務(wù)器的方法

    Node.js動(dòng)手?jǐn)]一個(gè)靜態(tài)資源服務(wù)器的方法

    這篇文章主要介紹了Node.js動(dòng)手?jǐn)]一個(gè)靜態(tài)資源服務(wù)器的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-03-03
  • nodejs操作mongodb的填刪改查模塊的制作及引入實(shí)例

    nodejs操作mongodb的填刪改查模塊的制作及引入實(shí)例

    下面小編就為大家分享一篇nodejs操作mongodb的填刪改查模塊的制作及引入實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • Node.js 多線程完全指南總結(jié)

    Node.js 多線程完全指南總結(jié)

    這篇文章主要介紹了Node.js 多線程完全指南總結(jié),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-03-03
  • node.js中的path.sep方法使用說(shuō)明

    node.js中的path.sep方法使用說(shuō)明

    這篇文章主要介紹了node.js中的path.sep方法使用說(shuō)明,本文介紹了path.sep的方法說(shuō)明、語(yǔ)法、使用實(shí)例,需要的朋友可以參考下
    2014-12-12

最新評(píng)論