我的NodeJs学习小结(一)

本文探讨了Node.js编程中的细节问题,包括高效遍历数组、变量真假判断、parseInt使用陷阱、循环中异步操作处理、递归调用避免、模块文件作用域隔离等,并介绍了如何使用promise改善代码结构。

这第一篇就谈谈NodeJs的一些编程细节吧。

    1、遍历数组

   

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

    这样写的一个好处就是让每次循环少一步获取数组对象长度的操作,数组长度越长,价值越明显。

    2、判断变量的真假

   

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

    if条件判断的结果分别是:false, true, true, true。这个结果和PHP的结果是不同的,不要混淆。还需要区分它和非恒等判断相似的情况。

    3、0值非恒等判断

   

1 if (0 == '0') {...} //true2 if (0 == []) {...} //true3 if (0 == [0]) {...} //true4 if (0 == {}) {...} //false5 if (0 == null) {...} //false6 if (0 == undefined) {...} //false

    其实还有很多这种诡异的判断,我只列出了较为常见的。如果想弄明白其中的规则,请参阅我的另一篇博文:【JavaScript】深入分析JavaScript的关系运算和if语句。

    4、parseInt的陷阱

   

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

    该语句执行后n值为8,而不是10。虽然很多人知道这一点,但是编程中难免会出错,我深有体会。所以,最好按下面的方式来写,就不会出错了。

   

var n = parseInt(s, 10);

    5、变量在使用前一定要先声明

    虽然,直接使用变量而不声明也不会出错,但是,这样写是很容易出错的。因为解释器会把它解释成全局变量,很容易和其他全局变量重名而导致出错。所以,一定要养成变量使用前要先声明的好习惯。

    6、循环中存在异步的情况

   

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为表查询操作,是异步操作}

    你会发现,输出的结果都是相同的,而且是当i=arr.length-1时的输出内容。因为JavaScript是单线程的,它会先执行完整个循环的同步内容之后,才去执行其中的异步操作。代码中的匿名回调函数就是一个异步回调。执行到该函数的时候,for循环以及后面的一些同步操作都已经执行完毕。出于闭包原则,该函数会保留for循环的最后一次循环的sql变量和i变量的内容,所以才会导致错误的结果。

    那怎么办呢?解决方法有两种,一种是使用立即函数,如下:

   

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);}

    还有一种方法是将异步操作部分提取出来,单写一个函数,如下:

   

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 、在对大量数据作处理时,尽量避免循环嵌套。

    因为循环嵌套的处理时间会随着数据量的增加成指数级增长,所以应尽量避免。遇到这种情况,如果没有更好的办法,一般采取的策略是以空间换时间,即建立一张二级循环数据的Hash映射表。当然,还要具体情况具体分析。还有一点要说的是,某些方法本身就是一个循环体,如Array.sort()(该方法应该是用了两层循环实现),在使用的时候需加注意。

    8、尽量避免递归调用。

    递归调用的优点是代码简洁,实现简单,而它的缺点很重要,说明如下:

    (1)函数栈的大小会随着递归层次成线性增长,而函数栈是有上限值的,当递归达到一定层数后函数栈就会溢出,从而导致程序出错;

    (2)每递归一层都会增加额外的压栈和出栈操作,即函数调用过程中的保存现场和恢复现场。

    所以,应尽量避免递归调用。

    9、关于模块文件的作用域隔离。

    Node在编译JavaScript模块文件的时候,已经对其内容进行了头尾包装,如下:

   

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

    从而使每个模块文件之间进行了作用域隔离。所以,当你编写NodeJs模块文件的时候,不需要自己再加一层作用域隔离封装了。如下面的代码格式,只会额外增加一层函数调用,是不推荐的:

   

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

    10、数组和对象不要混用

    下面是错误代码的示例:

   

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

    数组和对象混用可能会导致不可预知的错误。我的一个同事就遇到过一个很奇怪的问题,先看代码:

   

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

    他本以为对象o的name属性会在JSON串中,结果就是没有。当时我也很奇怪,但我有预感到是数组和对象混用的问题,试了一下,果然是它的问题。后来我在ECMA规范中查到,数组在序列化时是按JA规则进行的。所以,要养成一个好的编程习惯,正确使用数组和对象,不要混用。

    11、promise优雅编程

    相信接触过nodeJs的人都有过这样的体验,当异步回调里嵌套异步回调的时候,代码就显得很混乱,缺乏易读性。nodeJs的这一窘境可以借助promise来克服。promise就像一个雕琢器,让你的代码变得优雅、美观。promise有个A+规范,网上有几种实现方式,可以参阅。

   

您可能感兴趣的文章:
  • jQuery Deferred和Promise创建响应式应用程序详细介绍
  • Nodejs中自定义事件实例
  • nodejs文件操作模块FS(File System)常用函数简明总结
  • nodejs获取本机内网和外网ip地址的实现代码
  • 跟我学Nodejs(一)--- Node.js简介及安装开发环境
  • 利用NodeJS和PhantomJS抓取网站页面信息以及网站截图
  • 基于promise.js实现nodejs的promises库

    QQ空间 新浪微博 腾讯微博 搜狐微博 人人网 开心网 百度搜藏更多

    Tags:NodeJs

    复制链接收藏本文打印本文关闭本文返回首页

    上一篇:nodejs中使用monk访问mongodb

    下一篇:基于promise.js实现nodejs的promises库

   

相关文章

  • 2014-07-07我的Node.js学习之路(二)NPM模块管理
  • 2014-06-06什么是Node.js?Node.js详细介绍
  • 2014-06-06Node.js(安装,启动,测试)
  • 2014-07-07nodejs之请求路由概述
  • 2014-06-06使用upstart把nodejs应用封装为系统服务实例
  • 2014-06-06NODE.JS加密模块CRYPTO常用方法介绍
  • 2014-06-06connect中间件session、cookie的使用方法分享
  • 2014-06-06Nodejs进程管理模块forever详解
  • 2014-07-07我的Node.js学习之路(一)
  • 2014-06-06nodejs文件操作模块FS(File System)常用函数简明总结

   

文章评论

   

最 近 更 新

   

  • connect中间件session、cookie的使用方法
  • 在Node.js中实现文件复制的方法和实例
  • Node.js中对通用模块的封装方法
  • node.js正则表达式获取网页中所有链接的代
  • node.js WEB开发中图片验证码的实现方法
  • Nodejs中自定义事件实例
  • node.js实现逐行读取文件内容的代码
  • nodejs npm包管理的配置方法及常用命令介
  • 使用GruntJS构建Web程序之Tasks(任务)篇
  • 我的NodeJs学习小结(一)

   

热 点 排 行

   

  • nodejs文件操作模块FS(File Sys
  • nodejs获取本机内网和外网ip地址
  • Nodejs sublime text 3安装与配置
  • node.js WEB开发中图片验证码的实
  • NODE.JS加密模块CRYPTO常用方法介
  • Node.js(安装,启动,测试)
  • node.js应用后台守护进程管理器F
  • nodejs npm install全局安装和本
  • node.js实现多图片上传实例
  • nodejs npm包管理的配置方法及常
1. STM32F103: STM32F103是ST公司生产的基于ARM Cortex-M3内核的高性能微控制器,具有丰富的外设接口,广泛应用于嵌入式系统设计中。STM32F103系列微控制器以其高性能、低功耗和丰富的外设资源,成为许多工程师和爱好者首选的微控制器之。2. ICM20948: ICM20948是InvenSense公司推出的款高性能的9轴运动跟踪设备,集成3轴陀螺仪、3轴加速度计、3轴电子罗盘和DMP(Digital Motion Processor)数字运动处理器。ICM20948具有高精度的传感器输出,能够实现各种运动检测和处理,非常适合应用于运动控制、手势识别、虚拟现实等领域。3. DMP库: DMP库指的是Digital Motion Processor(数字运动处理器)的驱动库,这是套为ICM20948的DMP功能提供的软件支持。通过使用DMP库,开发者可以更加方便地利用ICM20948的数字运动处理能力,实现复杂动作的检测和处理,而无需在主微控制器上进行复杂的计算。4. 驱动库: 驱动库是种封装好的软件包,用于简化硬件设备的使用。在本资源中,STM32F103写的ICM20948带DMP的驱动库是个专门为STM32F103和ICM20948组合编写的软件库,使得开发者可以更快速地将ICM20948集成到STM32F103项目中,并且能够充分发挥ICM20948的性能。5. 亲测可用: 描述中的"亲测可用"表明该驱动库已经由开发者在实际的硬件上测试过,并且验证其功能性和稳定性。这为其他开发者提供了个可靠的参考,意味着该库可以被直接应用于项目开发中,无需额外的调试和验证工作。6. STM32环境: STM32环境指的是基于STM32微控制器的系列开发工具和软件环境,包括IDE、编译器、调试器和相关的库文件等。在这个上下文中,ICM20948 DMP-STM32环境表明驱动库是专门为STM32开发环境准备的,开发者需要在STM32的开发环境中使用该库。使用ICM20948 STM32F103 DMP库,开发者可以轻松地将高精度的运动检测和处理功能集成到自己的项目中,提高产品的智能化和用户体验。例如,在可穿戴设备、游戏控制器、机器人等应用中,开发者可以利用ICM20948的DMP功能来实现动作识别、步数计算、运动轨迹追踪等功能。总结来说,ICM20948 STM32F103 DMP库是针对STM32F103微控制器和ICM20948运动传感器的套成熟的驱动库,该库通过封装DMP处理功能,大幅降低了开发者在项目开发中对硬件的操作难度,为快速开发运动相关的应用提供了便利。开发者可以利用这工具包,充分发挥ICM20948的性能,实现多种运动检测和处理功能,从而提升产品的技术含量和市场竞争力
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值