返回顶部
首页 > 资讯 > 前端开发 > node.js >我的NodeJs学习小结(一)
  • 391
分享到

我的NodeJs学习小结(一)

小结NodeJs 2022-06-04 17:06:50 391人浏览 安东尼
摘要

这第一篇就谈谈nodejs的一些编程细节吧。 1、遍历数组 for (var i=0, l=arr.length; i<l; i++) 这样写的一个好处就是让每次循环少一步获取数

这第一篇就谈谈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') {...} //true
2 if (0 == []) {...} //true
3 if (0 == [0]) {...} //true
4 if (0 == {}) {...} //false
5 if (0 == null) {...} //false
6 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+规范,网上有几种实现方式,可以参阅。

--结束END--

本文标题: 我的NodeJs学习小结(一)

本文链接: https://lsjlt.com/news/11818.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 我的NodeJs学习小结(一)
    这第一篇就谈谈NodeJs的一些编程细节吧。 1、遍历数组 for (var i=0, l=arr.length; i<l; i++) 这样写的一个好处就是让每次循环少一步获取数...
    99+
    2022-06-04
    小结 NodeJs
  • 我的Node.js学习之路(一)
    一,node.js介绍 这些网上一大堆信息,我只精简 1,什么是node.js 从核心上说:Node.js是个事件驱动的服务器端javascript环境,也就是说,我们可以像使用PHP,Ruby和P...
    99+
    2022-06-04
    之路 Node js
  • JWT学习小结
    JWT全称JSON-Web-Tokens,是一套应对Http其无状态且明文传递请求的特性的规范,保证请求的安全性。我们一般用它来在服务端和客户端之间传递用户的身份信息,实现状态保持。 1,相较于常见的session+cookie的实现方式...
    99+
    2023-01-30
    小结 JWT
  • Python学习利器——我的小白 An
    Python学习利器——我的小白 Anaconda安装之路 序 Python易用,但用好却不易,其中比较头疼的就是包管理和Python不同版本的问题,特别是当你使用Windows的时候。为了解决这些问题,有不少发行版的Python,比如W...
    99+
    2023-01-31
    利器 Python
  • 我的python学习--第十一天
    上午:作业讲解bootstrap-multiselect插件sweetalert插件下午:datatables----表格插件datetimepicker----时间插件Validform----表单验证插件锁定用户禁止登录---...
    99+
    2023-01-31
    第十一天 python
  • 跟我一起学习pybind11 之一
    pybind11是一个轻量级的“Header-only”的库,它将C++的类型暴露给Python,反之亦然。主要用于将已经存在的C++代码绑定到Python。pybind11的目标和语法都类似于boost.python库。利用编译时的内...
    99+
    2023-01-31
    跟我一起
  • 我的python学习--第十四天(一)
    一、运维管理系统(基于Flask)回顾1、权限控制  通过session实现权限控制,session是一个全局字典,当用户登录时,可以获取到用户的用户名,通过查找数据库获取用户的权限保存进session中,在每次页面跳转时同过查询sessi...
    99+
    2023-01-31
    第十四天 python
  • BASH 学习笔记小结
    1. Linux 脚本编写基础 1.1 语法基本介绍 1.1.1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例...
    99+
    2022-06-04
    小结 学习笔记 BASH
  • mysql学习总结(一)
        作为一名小白,今天开始上传自己的学习总结。 ...
    99+
    2016-11-21
    mysql学习总结(一)
  • 我常用的一些linux命令小结
    之前做过两年的运维,用过很多命令,深切体会到某些linux命令熟练掌握后对效率提升有多大。举个简单的例子,在做了研发后经常会有跑一些数据,对于结果数据的处理,我们的产品同学一般都习惯于用excel做统计,把数据复制到ex...
    99+
    2022-06-04
    linux常用命令
  • node.js操作mongodb学习小结
    一、准备工作 1、在mongodb创建将要读取的表 创建数据库mongotest use mongotest; 向user表中插入数据 db.user.insert({ name:'flyoung'...
    99+
    2022-06-04
    小结 操作 node
  • Bash Shell脚本学习小结
    1.字符截断:如果是一般路径的字符截断可以用basename和dirname这两个工具:basename可以从一个文件路径中截一个文件名 例如: $ basename /home/file.tarfile...
    99+
    2022-06-04
    小结 脚本 Bash
  • 我的H3CNE学习之路
    今天2015年11月27日,我开始了H3CNE学习之旅,下载了H3C官方的PDF课程H3CNEV6.0和H3CNE的视频教程开始学习。《构建中小企业网络》全书共分7篇32章第一篇计算机网络基础第二篇H3C网络设备操作入门第三篇配置局域网交换...
    99+
    2023-01-31
    之路 H3CNE
  • 我的Python学习之路
    从今天起开始记录我的Python学习之路。 现在的我只是一个学习Linux服务器的大三学生党,在大学中不断的学习是必要的,学习完了写技术博客也是必要的,不管有没有人看,这对于自己来说都是有好处的。 最近发现Python这个强大的语言,就如它...
    99+
    2023-01-31
    之路 Python
  • 我的python学习--第五天
    一、函数的定义:  def 函数名(name,age=20,*params):    函数体    return 返回值  示例:def hello():     print 'hello world'               # pr...
    99+
    2023-01-31
    第五天 python
  • 我的python学习--第四天
    一、首先是对前三天的学习内容进行复习  1、python基础的数据结构      数字(int/float,包括整数和浮点数)          布尔(boolean => True/False)      字符串(str,使用''或...
    99+
    2023-01-31
    第四天 python
  • 我的python学习--第三天
    第三天  1:列表及Python基础回顾  2:字典 列表字典生成式及应用场景  3:字符串 字典字符串转换及应用场景  4:文件操作 文件字典转换及应用场景  5:总结基础数据结构的知识脑图 -- 增删查改1、列表的操作:  help(l...
    99+
    2023-01-31
    python
  • 我的python学习记录-eclipse
       在我们使用eclipse这样的ide开发python时,总是喜欢让编辑器做一些我们每次写程序都必须做的事。    在新建的python module源文件开头中我们每次可能都要写:       #!usr/bin/python    ...
    99+
    2023-01-31
    python eclipse
  • 学习笔记-小甲鱼Python3学习第十一
    从列表中获取元素:列表索引值是从0开始的例把'郑十'和'王五'的位置调换一下>>> member['张三', '李四', '郑十', '王五', '赵六', '陈七', '马八', '孙九']>>> me...
    99+
    2023-01-31
    甲鱼 学习笔记
  • 学习笔记-小甲鱼Python3学习第一讲
    测试题: 0、python 是什么类型的语言?python是一种脚本语言 IDLE 是什么?是一种python shell,类似于windows的cmd窗口和linux的shell print() 的作用是什么?打印到窗口显示 a ...
    99+
    2023-01-31
    甲鱼 学习笔记
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作