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. for (var key in obs) {},这里的key一定是字符串,有时为了保证逻辑正确,可能要转成其它类型。
  13. 对象字面量,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。
  14. 对于array,var a = []; a[0]=1;和a["0"]=1;效果一样。
  15. 如果想让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]就好。
  16. for of的性能很差,for in也好一点,但也不太好,如数据量少,尽量使用array,for i来遍历。
  17. object的查找性能比array好很多,不过遍历性却差很多很多,如果数据变化少、查找也少,但遍历多,考虑用array。
  18. array的forEach、find的性能都不如for i快,就是更方便而已,indexOf的话,速度快不少,但只能直接匹配、不能某字段匹配,不过性能还是不如object[key]。
  19. 对于类类型,o.constructor === Class比 o instanceof Class慢,对于基本类型o.constructor === Class比 typeof(o) === "string"慢。
  20. 数字、字符串、布尔 instanceof Number/String/Boolean为false,那得用typeof(o) === "number"、typeof(o) === "string"、typeof(o) === "boolean"。
  21. ES6的三点运算(...)效率比较低。
  22. js有个比较恶心的地方:[] == false,但![] == false也是,"0" == false,但!"0" == false也是。
  23. var o = {a:1,b:2},如果o[a],很快,如果o[c],一个不存在的key,慢一点,如果o[undefined]或o[null],很慢很慢很慢,千万不要这样用,可以考虑用o[key || ""]。
  24. 一般===的性能高于==,有时甚至是远高于,也就是说,如果不是故意允许类型不一致地相等,尽量用===。v == null或v == undefined可以写成v === null || v === undefined,不过比较麻烦了。
  25. 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];}。
  26. 获取时间戳,使用Date.now(),new Date().getTime()会慢一倍。
  27. 以下两个代码,哪个快?
    for(var i=0;i<o.arr.length;++i)
    {
    s+=o.arr[i].a+o.arr[i].b+o.arr[i].c;
    }
    for(var i=0,len=o.arr.length;i<len;++i)
    {
    var item = o.arr[i];
    s+=item.a+item.b+item.c;
    }

    本来我们可能觉得后者快,因为o.arr.length会有额外运算,o.arr[i]也会有额外运算,但实际上测试发现,前者比后者快,这个现象在使用v8 js引擎的node.js上是这样的,其它js引擎有可能后者快,可能v8 js引擎会对多余、重复的运算做优化。

  28. 自定义的类如果想跟Number值做计算,跟String做自定义的连接,转成合理的JSON字符串,可以重载valueOf()、toString()、toJSON()方法。

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

代码:

 var vals = {"undefined":undefined,"null":null,"{}":{},"[]":[],"false":false,"0":0,"\"0\"":"0","\"\"":"","NaN":NaN,"Infinity":Infinity}
var result = "";
var alignLen = 50;
function addPadding(str)
{
str += new Array(alignLen - str.length).join(" ");
return str;
}
for (var i in vals)
{
result += addPadding("类型" + i);
result += "\r\n";
result += addPadding("!!" + i);
result += !!vals[i];
result += "\r\n";
for (var j in vals)
{
result += addPadding(i + " == " + j);
result += vals[i] == vals[j];
result += "\r\n";
}
result += "\r\n";
}
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

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

  1. Node.js学习记录

    一.NPM 使用介绍 NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种: 允许用户从NPM服务器下载别人编写的第三方包到本地使用. 允许用 ...

  2. Node.js学习记录(一)--安装设置篇

    安装Node window window上安装node可选择以下两种方式: 方式一:直接进入官网下载安装 进入node.js官网点击windows,选择.msi后缀的,根据自己的电脑选择对应的64位或 ...

  3. 关于node.js和npm,cnpm的安装记录以及gulp自动构建工具的使用

    关于node.js和npm,cnpm的安装记录以及gulp自动构建工具的使用   工作环境:window下 在一切的最开始,安装node.js (中文站,更新比较慢http://nodejs.cn/) ...

  4. Node.js log4js日志记录

    这次需要给之前弄的文件服务器添加日志记录,一般每天产生的日志会特别多所以安装日期来划分是最好的,这里我用了express框架,为了适应express框架这里在log.js文件中写了use方法. //日 ...

  5. Node.js权威指南学习记录

    学习nodeJS权威指南的学习记录 导航: 1.console模块 2.全局变量 3.Buffer对象 4.事件对象 5.网络请求 6.文件操作对象 一. COMMON.js的学习.(commonJS ...

  6. 记录一次用宝塔部署微信小程序Node.js后端接口代码的详细过程

    一直忙着写毕设,上一次写博客还是元旦,大半年过去了.... 后面会不断分享各种新项目的源码与技术.欢迎关注一起学习哈! 记录一次部署微信小程序Node.js后端接口代码的详细过程,使用宝塔来部署. 我 ...

  7. e2e 自动化集成测试 架构 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step (五) 如何让窗体记录登录状态Session

    在写自动化测试的Node.js脚本时, 时常需要测试所写的case, 可能都需要去重新登录一遍,这将相当的耗时, 好在Selenium都借了Session的机制, 如果在最初的浏览器没有关闭的情况下, ...

  8. 学习用Node.js和Elasticsearch构建搜索引擎(6):实际项目中常用命令使用记录

    1.检测集群是否健康. curl -XGET 'localhost:9200/_cat/health?v' #后面加一个v表示让输出内容表格显示表头 绿色表示一切正常,黄色表示所有的数据可用但是部分副 ...

  9. 记录下使用iis7代理node.js写的网站程序

    昨天晚上一个学弟的紧急求救,说了自己接的单子做了一个网站,使用了自己熟悉的技术——node.js+mongdb,但当看到部署环境惊呆了,是 windows+sqlserver.这些都不是关键,关键是服 ...

随机推荐

  1. 病毒侵袭持续中 - HDU 3065(AC自动机,判断子串个数)

    分析:依然是一个模板题,不过在写建立失败指针的地方竟然写错了三次....看来现在状态不太好.   代码如下: ============================================= ...

  2. angularJs $injector

    一 angularJS中几种注入方式 Spring中使用构造注入或者设值注入的方式,还需要做一些额外的操作,但是angular中只需要在需要的地方声明一下即可,类似模块的引用,因此十分方便. angu ...

  3. mybatis 关联对象mapper.xml的写法

    https://github.com/zfrHJ/mybaties/blob/master/mybaties/src/com/itheima/mybatits/mapper/OrdersMapperC ...

  4. 利用column-width属性设置多栏布局

    css样式设置为: div{ background:blanchedalmond; margin:0 auto; width:1230px; -moz-column-width:400px; -web ...

  5. pull解析和sax解析的差别

    假设在一个XML文档中我们仅仅须要前面一部分数据.可是使用SAX方式或DOM方式会对整个文档进行解析,虽然XML文档中后面的大部分数据我们事实上都不须要解析.因此这样实际上就浪费了处理资源. 使用PU ...

  6. jQuery Ajax 实例 具体介绍$.ajax、$.post、$.get的使用

    Jquery在异步提交方面封装的非常好.直接用AJAX非常麻烦须要处理浏览器之间的兼容问题,Jquery大大简化了我们的这些操作操作.不用在考虑浏览器这方面的问题,能够直接使用! $.post.$.g ...

  7. 黑马程序猿_try-catch-finally

    ------- android培训.java培训.期待与您交流! ---------- try-catch-finally中怎样定义语句呢? 1.try块中主要定义可能出现的异常处理语句 2.catc ...

  8. jquery自定义插件来实现分页的效果

    本节将介绍如何定义自己的jquery插入,实现分页效果,话不多说,.看看达到的效果: 分页插件 实现的代码例如以下: <!DOCTYPE HTML PUBLIC "-//W3C//DT ...

  9. intent和intentfilter

    intent 和intent Filters startActivity()的机制 用到了IBinder ipc 用到了进程间通讯机制 activity有四种LaunchMode 当startActi ...

  10. 基于库zkclient 的leader选举代码实现

    利用了zookeeper临时节点,在当连接或session断掉时被删除这一特性来做选举.(简单简单互斥锁) 查了下网上的做法. 大致流程: <1>判定是否存在/wzgtest路径 < ...