node.js使用经验记录

MongoDB使用经验:

  1. 有时不知道MongoDB的错误码代表什么,那有这个链接:

    https://github.com/mongodb/mongo/blob/master/src/mongo/base/error_codes.err

  2. 关于MongoDB连接字符串,有两个经验:
    • 对于node.js驱动,如果要保证一个用户的数据写入到数据库是按调用的顺序来的,请在连接字符串里设置poolSize=1或maxPoolSize=1。
    • w=majority会导致性能很差,用w=1吧。

Node.js本身使用经验:

  1. os.hostname()很慢,不要实时用。
  2. send完网络数据后,不要马上去修改这个被发送的数据Buffer,不然可能会导致发送的是被修改后的。
  3. domain不能捕获Promise.coroutine的错误,只能自己在coroutine里try catch,或者使用.catch(function(err){});调用。
  4. bluebird的创建coroutine很慢很慢很慢,每次启用要消耗快0.1ms,所以除非调用很不频繁,比如程序启动、结束时才调用,否则得先创建,保存到变量,再调用。不过new Promise就比较快了,但这个用法是把非promise转为promise。
  5. require后面的路径名注意大小写一致,不然会得到不一样的模块。

Javascript使用经验(基于ES6标准):

  1. var v = a || 0;,当a为null、undefined时,可以获取默认值(0),但a等价false的情况很多,比如可能a==="",这时需要这个值,但还是得到0,这就不是我们要的。
  2. 对于js,var定义的变量是function内都可见,而es6标签有let,在{}内才可见。
  3. 对于js,由于可以有函数内的内部函数,内部函数的this引用的不是外层的this,如果要访问外部的this,可以var self = this,然后在内部函数里使用self来访问外层的this。
  4. 如果number转number,parseFloat奇慢,parseInt快多了,不过Math.floor、>>0、>>>0(转为无符号数)更快,但移位计算仅对int32范围的数有效,慎用。如果字符串转整数,都差不多了,都慢。
  5. parseInt(n, 10)带上进率,效率会更好。
  6. double能保存最大的整数是2^53,54位,如果要从二进制Buffer里读取int64,如果不考虑精度,可以如下做:

    var high = buffer.readInt32BE(readPos);
    var low = buffer.readUInt32BE(readPos + 4);
    high * 0x100000000 + low;
  7. 类名.prototype.函数名.call很慢,如果为了效率,别用它。比如常见的Array.prototype.slice.call、Object.prototype.toString.call。
  8. 如果没有必要,不要使用eval,new Function。
  9. 移位时,移位数>=32时,会减到32以内,比如 1 << 32其实就是 1 << 0。
  10. 对于array,如果没有必要,不要使用arr.splice(0, arr.length)来清空,而是用arr = [],这样效率更好,如果这个arr对象被别处引用了,那就可能不得不用splice。
  11. object的key一定是字符串,如果不是字符串会转为字符串,而ES6的Map的key可以是任意类型且采用===比较法(如果是对象,引用同一个对象才是相等)。
  12. 对象字面量,var o = {a:1,b:2,1:1,2:2,"a.b":3},这里的a、b、1、2虽然没引号,但也当字符串处理,如果key是一个表达式的值,那就可以:var o = {[1+2]:3}或o[1+2]=3。
  13. 对于array,var a = []; a[0]=1;和a["0"]=1;效果一样。
  14. 如果想让key允许任意值,那就得使用Map、Set。但Map、Set的性能不如object[key]。如果接受key只能为string,那就尽量使用object。而且Map、Set的for of遍历性能不如object的for in和array的for var i,所以尽量使用object、array。无论object、Map、Set,为了性能,尽量不要拼接key字符串,也就是o[a+b]这样,性能不好,直接o[k]就好。
  15. for of的性能很差,for in也好一点,但也不太好,如数据量少,尽量使用array,for i来遍历。
  16. object的查找性能比array好很多,不过遍历性却差很多很多,如果数据变化少、查找也少,但遍历多,考虑用array。
  17. array的forEach、find的性能都不如for i快,就是更方便而已,indexOf的话,速度快不少,但只能直接匹配、不能某字段匹配,不过性能还是不如object[key]。
  18. 对于类类型,o.constructor === Class比 o instanceof Class慢,对于基本类型o.constructor === Class比 typeof(o) === "string"慢。
  19. 数字、字符串、布尔 instanceof Number/String/Boolean为false,那得用typeof(o) === "number"、typeof(o) === "string"、typeof(o) === "boolean"。
  20. ES6的三点运算(...)效率比较低。
  21. js有个比较恶心的地方:[] == false,但![] == false也是,"0" == false,但!"0" == false也是。
  22. var o = {a:1,b:2},如果o[a],很快,如果o[c],一个不存在的key,慢一点,如果o[undefined]或o[null],很慢很慢很慢,千万不要这样用,可以考虑用o[key || ""]。
  23. 一般===的性能高于==,有时甚至是远高于,也就是说,如果不是故意允许类型不一致地相等,尽量用===。v == null或v == undefined可以写成v === null || v === undefined,不过比较麻烦了。
  24. Object.getOwnPropertyNames、Object.keys、for in都是获取对象的属性,不过相比Object.keys,for in 会遍历到原型链上的可枚举属性(不包括自身、原型链上的不可枚举属性),相比Object.keys,Object.getOwnPropertyNames会获取自身的不可枚举的属性(不包括原型链上的可枚举、不可枚举属性)。速度:Object.keys + for i > Object.getOwnPropertyNames + for i > for in。for i 就是指for (var i = 0, len = keys.length; i  < len; ++i){var k = keys[i];}。
  25. 获取时间戳,使用Date.now(),new Date().getTime()会慢一倍

JS里false值的不严格等于考察:

代码:

 1 var vals = {"undefined":undefined,"null":null,"{}":{},"[]":[],"false":false,"0":0,"\"0\"":"0","\"\"":"","NaN":NaN,"Infinity":Infinity}
 2 var result = "";
 3 var alignLen = 50;
 4 function addPadding(str)
 5 {
 6     str += new Array(alignLen - str.length).join(" ");
 7     return str;
 8 }
 9 for (var i in vals)
10 {
11     result += addPadding("类型" + i);
12     result += "\r\n";
13     result += addPadding("!!" + i);
14     result += !!vals[i];
15     result += "\r\n";
16     for (var j in vals)
17     {
18         result += addPadding(i + " == " + j);
19         result += vals[i] == vals[j];
20         result += "\r\n";
21     }
22     result += "\r\n";
23 }
24 console.log(result);

结果:

类型0 
!!0                                              false
0 == 0                                           true
0 == undefined                                   false
0 == null                                        false
0 == {}                                          false
0 == []                                          true
0 == false                                       true
0 == "0"                                         true
0 == ""                                          true
0 == NaN                                         false
0 == Infinity                                    false

类型undefined
!!undefined                                      false
undefined == 0                                   false
undefined == undefined                           true
undefined == null                                true
undefined == {}                                  false
undefined == []                                  false
undefined == false                               false
undefined == "0"                                 false
undefined == ""                                  false
undefined == NaN                                 false
undefined == Infinity                            false

类型null
!!null                                           false
null == 0                                        false
null == undefined                                true
null == null                                     true
null == {}                                       false
null == []                                       false
null == false                                    false
null == "0"                                      false
null == ""                                       false
null == NaN                                      false
null == Infinity                                 false

类型{}
!!{}                                             true
{} == 0                                          false
{} == undefined                                  false
{} == null                                       false
{} == {}                                         true
{} == []                                         false
{} == false                                      false
{} == "0"                                        false
{} == ""                                         false
{} == NaN                                        false
{} == Infinity                                   false

类型[]
!![]                                             true
[] == 0                                          true
[] == undefined                                  false
[] == null                                       false
[] == {}                                         false
[] == []                                         true
[] == false                                      true
[] == "0"                                        false
[] == ""                                         true
[] == NaN                                        false
[] == Infinity                                   false

类型false
!!false                                          false
false == 0                                       true
false == undefined                               false
false == null                                    false
false == {}                                      false
false == []                                      true
false == false                                   true
false == "0"                                     true
false == ""                                      true
false == NaN                                     false
false == Infinity                                false

类型"0"
!!"0"                                            true
"0" == 0                                         true
"0" == undefined                                 false
"0" == null                                      false
"0" == {}                                        false
"0" == []                                        false
"0" == false                                     true
"0" == "0"                                       true
"0" == ""                                        false
"0" == NaN                                       false
"0" == Infinity                                  false

类型""
!!""                                             false
"" == 0                                          true
"" == undefined                                  false
"" == null                                       false
"" == {}                                         false
"" == []                                         true
"" == false                                      true
"" == "0"                                        false
"" == ""                                         true
"" == NaN                                        false
"" == Infinity                                   false

类型NaN
!!NaN                                            false
NaN == 0                                         false
NaN == undefined                                 false
NaN == null                                      false
NaN == {}                                        false
NaN == []                                        false
NaN == false                                     false
NaN == "0"                                       false
NaN == ""                                        false
NaN == NaN                                       false
NaN == Infinity                                  false

类型Infinity
!!Infinity                                       true
Infinity == 0                                    false
Infinity == undefined                            false
Infinity == null                                 false
Infinity == {}                                   false
Infinity == []                                   false
Infinity == false                                false
Infinity == "0"                                  false
Infinity == ""                                   false
Infinity == NaN                                  false
Infinity == Infinity                             true 
时间: 2024-08-25 05:38:01

node.js使用经验记录的相关文章

小白学习node.js的记录

本人对于node.js一无所知,纯纯的小白一枚,想学习的初衷是了解node.js是什么,能用它干点什么,说白就是好奇心使然吧.接下来记录自己的学习过程. 注:若有错误欢迎指出,互相学习.segmentfault        stackoverflow 谁适合阅读本教程? 如果你是一个前端程序员,你不懂得像PHP.Python或Ruby等动态编程语言,然后你想创建自己的服务,那么Node.js是一个非常好的选择. Node.js 是运行在服务端的 JavaScript,如果你熟悉Javascri

Node.js安装记录

Node.js安装及环境配置之Windows篇 安装 Node.js 的时候会自动安装 npm ,并且 npm 就是 Node.js 的包管理工具(node package manager 的缩写). 参考:https://www.npmjs.com/about 所以,安装Node.js默认就会安装npm,安装npm最简单的方式就是安装node. 参考:https://docs.npmjs.com/downloading-and-installing-node-js-and-npm#using-

node js学习记录

nodejs 新版本自带 npm 工具,使用 npm install 即可安装一些组件 安装插件前需 使用npm  init 进行配置文件初始化, 直接回车即可 安装express  :    npm install  express express 4.0 版本以后还要安装  npm install  express-generator 即可以使用 express 进行项目

node.js web开发:EXPRESS 4.x 以上使用session和cookie 的记录

关于session 和cookie 我搞了2-3天, 发现这个玩意也挺麻烦的. 很多教程都是把这种会话保存在nosql里面,比如mongo,或者redis等等.但是我还是想直接保存在计算机的内存中,比较符合传统的方式.网上也有很多这方面的文章,但基本上都是你抄我的,我抄你的,而且express有很多这种session/cookie的中间件,总是让人弄迷糊.很多文章都是点到为止,完全要靠自己慢慢去试,去看文档,去摸索. 我是基于connect这个中间件实现的.这个middleware 功能非常强大

node.js内存泄露问题记录

先说一下.事情的来龙去脉. 公司开发一款游戏棋牌游戏,服务端的开发是IO密集型,开发的时候,考虑过使用python,java,node.js. 终于选择了node.js(node.js宣传的杀手功能.异步IO,node.js另外一个分支叫io.js),事情也就由此而起. 由于第一次做手机游戏.对移动网络的预计不足.选择了json作为通信数据传输格式.上线后玩家就频繁掉线(通信数据量太大,移动网络hold不住), 于是想了一个解决方式,把json数据用zip压缩一下,事情好像就万事大吉了(尽管也有

node.js环境搭建记录

第一步:下载安装文件 下载地址:官网http://www.nodejs.org/download/ 第二步:安装nodejs 下载完成之后,双击 node-v0.8.16-x86.msi,开始安装nodejs,默认是安装在C:\Program Files\nodejs下面 第三步:安装相关环境 打开C:\Program Files\nodejs目录你会发现里面自带了npm,直接用npm安装相环境既可 进入node.js command prompt 命令窗口 进入nodejs 安装目录 C:\P

Node.JS 学习路线图

转载自:http://www.admin10000.com/document/4624.html 从零开始nodejs系列文章, 将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发.Nodejs框架是基于V8的引擎,是目前速度最快的 Javascript引擎.chrome浏览器就基于V8,同时打开20-30个网页都很流畅.Nodejs标准的web开发框架Express,可以帮 助我们迅速建立web站点,比起PHP的开发效率更高,而且学习曲线更低.非常适合小型网站,个性

Node.JS 学习路线图,Node.JS最佳学习资料

原文出处: 张丹的博客(@Conan_Z) Node.JS 让人心动的技术. 从零开始nodejs系列文章, 将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发.Nodejs框架是基于V8的引擎,是目前速度最快的 Javascript引擎.chrome浏览器就基于V8,同时打开20-30个网页都很流畅.Nodejs标准的web开发框架Express,可以帮 助我们迅速建立web站点,比起PHP的开发效率更高,而且学习曲线更低.非常适合小型网站,个性化网站,我们自己的G

[Node.js] express 安装的问题

今天学习express的时候发现安装了express模块但是死活不能使用express命令,在windows上提示内部或者外部命令.在Linux上也不能使用,类似的错误信息.在网上找到了解决方案,记录如下: 版本问题,安装的时候使用命令: npm install -g [email protected]   即可解决问题 刚学习node.js,不知道问题的根源是什么?希望知道的大虾解析一下,拜谢.... ==========================华丽的分割线==============