node.js使用经验记录
MongoDB使用经验:
有时不知道MongoDB的错误码代表什么,那有这个链接:
https://github.com/mongodb/mongo/blob/master/src/mongo/base/error_codes.err
- 关于MongoDB连接字符串,有两个经验:
- 对于node.js驱动,如果要保证一个用户的数据写入到数据库是按调用的顺序来的,请在连接字符串里设置poolSize=1或maxPoolSize=1。
- w=majority会导致性能很差,用w=1吧。
Node.js本身使用经验:
- os.hostname()很慢,不要实时用。
- send完网络数据后,不要马上去修改这个被发送的数据Buffer,不然可能会导致发送的是被修改后的。
- domain不能捕获Promise.coroutine的错误,只能自己在coroutine里try catch,或者使用.catch(function(err){});调用。
- bluebird的创建coroutine很慢很慢很慢,每次启用要消耗快0.1ms,所以除非调用很不频繁,比如程序启动、结束时才调用,否则得先创建,保存到变量,再调用。不过new Promise就比较快了,但这个用法是把非promise转为promise。
- require后面的路径名注意大小写一致,不然会得到不一样的模块。
Javascript使用经验(基于ES6标准):
- var v = a || 0;,当a为null、undefined时,可以获取默认值(0),但a等价false的情况很多,比如可能a==="",这时需要这个值,但还是得到0,这就不是我们要的。
- 对于js,var定义的变量是function内都可见,而es6标准有let,在{}内才可见。
- 对于js,由于可以有函数内的内部函数,内部函数的this引用的不是外层的this,如果要访问外部的this,可以var self = this,然后在内部函数里使用self来访问外层的this。
- 如果number转number,parseFloat奇慢,parseInt快多了,不过Math.floor、>>0、>>>0(转为无符号数)更快,但移位计算仅对int32范围的数有效,慎用。如果字符串转整数,都差不多了,都慢。
- parseInt(n, 10)带上进率,效率会更好。
- double能保存最大的整数是2^53,54位,如果要从二进制Buffer里读取int64,如果不考虑精度,可以如下做:
var high = buffer.readInt32BE(readPos);
var low = buffer.readUInt32BE(readPos + 4);
high * 0x100000000 + low; - 类名.prototype.函数名.call很慢,如果为了效率,别用它。比如常见的Array.prototype.slice.call、Object.prototype.toString.call。
- 如果没有必要,不要使用eval,new Function。
- 移位时,移位数>=32时,会减到32以内,比如 1 << 32其实就是 1 << 0。
- 对于array,如果没有必要,不要使用arr.splice(0, arr.length)来清空,而是用arr = [],这样效率更好,如果这个arr对象被别处引用了,那就可能不得不用splice。
- object的key一定是字符串,如果不是字符串会转为字符串,而ES6的Map的key可以是任意类型且采用===比较法(如果是对象,引用同一个对象才是相等)。
- for (var key in obs) {},这里的key一定是字符串,有时为了保证逻辑正确,可能要转成其它类型。
- 对象字面量,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。
- 对于array,var a = []; a[0]=1;和a["0"]=1;效果一样。
- 如果想让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]就好。
- for of的性能很差,for in也好一点,但也不太好,如数据量少,尽量使用array,for i来遍历。
- object的查找性能比array好很多,不过遍历性却差很多很多,如果数据变化少、查找也少,但遍历多,考虑用array。
- array的forEach、find的性能都不如for i快,就是更方便而已,indexOf的话,速度快不少,但只能直接匹配、不能某字段匹配,不过性能还是不如object[key]。
- 对于类类型,o.constructor === Class比 o instanceof Class慢,对于基本类型o.constructor === Class比 typeof(o) === "string"慢。
- 数字、字符串、布尔 instanceof Number/String/Boolean为false,那得用typeof(o) === "number"、typeof(o) === "string"、typeof(o) === "boolean"。
- ES6的三点运算(...)效率比较低。
- js有个比较恶心的地方:[] == false,但![] == false也是,"0" == false,但!"0" == false也是。
- var o = {a:1,b:2},如果o[a],很快,如果o[c],一个不存在的key,慢一点,如果o[undefined]或o[null],很慢很慢很慢,千万不要这样用,可以考虑用o[key || ""]。
- 一般===的性能高于==,有时甚至是远高于,也就是说,如果不是故意允许类型不一致地相等,尽量用===。v == null或v == undefined可以写成v === null || v === undefined,不过比较麻烦了。
- 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];}。
- 获取时间戳,使用Date.now(),new Date().getTime()会慢一倍。
- 以下两个代码,哪个快?
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引擎会对多余、重复的运算做优化。
- 自定义的类如果想跟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使用经验记录的更多相关文章
- Node.js学习记录
一.NPM 使用介绍 NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种: 允许用户从NPM服务器下载别人编写的第三方包到本地使用. 允许用 ...
- Node.js学习记录(一)--安装设置篇
安装Node window window上安装node可选择以下两种方式: 方式一:直接进入官网下载安装 进入node.js官网点击windows,选择.msi后缀的,根据自己的电脑选择对应的64位或 ...
- 关于node.js和npm,cnpm的安装记录以及gulp自动构建工具的使用
关于node.js和npm,cnpm的安装记录以及gulp自动构建工具的使用 工作环境:window下 在一切的最开始,安装node.js (中文站,更新比较慢http://nodejs.cn/) ...
- Node.js log4js日志记录
这次需要给之前弄的文件服务器添加日志记录,一般每天产生的日志会特别多所以安装日期来划分是最好的,这里我用了express框架,为了适应express框架这里在log.js文件中写了use方法. //日 ...
- Node.js权威指南学习记录
学习nodeJS权威指南的学习记录 导航: 1.console模块 2.全局变量 3.Buffer对象 4.事件对象 5.网络请求 6.文件操作对象 一. COMMON.js的学习.(commonJS ...
- 记录一次用宝塔部署微信小程序Node.js后端接口代码的详细过程
一直忙着写毕设,上一次写博客还是元旦,大半年过去了.... 后面会不断分享各种新项目的源码与技术.欢迎关注一起学习哈! 记录一次部署微信小程序Node.js后端接口代码的详细过程,使用宝塔来部署. 我 ...
- e2e 自动化集成测试 架构 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step (五) 如何让窗体记录登录状态Session
在写自动化测试的Node.js脚本时, 时常需要测试所写的case, 可能都需要去重新登录一遍,这将相当的耗时, 好在Selenium都借了Session的机制, 如果在最初的浏览器没有关闭的情况下, ...
- 学习用Node.js和Elasticsearch构建搜索引擎(6):实际项目中常用命令使用记录
1.检测集群是否健康. curl -XGET 'localhost:9200/_cat/health?v' #后面加一个v表示让输出内容表格显示表头 绿色表示一切正常,黄色表示所有的数据可用但是部分副 ...
- 记录下使用iis7代理node.js写的网站程序
昨天晚上一个学弟的紧急求救,说了自己接的单子做了一个网站,使用了自己熟悉的技术——node.js+mongdb,但当看到部署环境惊呆了,是 windows+sqlserver.这些都不是关键,关键是服 ...
随机推荐
- Java 单元测试Junit
@Test @Before @After 测试方法运行前执行Before动作(比如创建资源),运行后执行After动作(比如销毁资源) @BeforeClass @AfterClass 测试类运行前执 ...
- DateTime日期格式获取 分类: C# 2014-04-15 10:36 233人阅读 评论(0) 收藏
c#.net 获取时间年月日时分秒格式 //获取日期+时间 DateTime.Now.ToString(); // 2008-9-4 20:02:10 DateTime.Now. ...
- HTTP协议和WEB应用
一.应用层协议原理 1.套接字(Socket):主机地址+端口地址.(通常为32位IP地址和16位端口号组成,总长度为48位) 2.进程通过套接字来接收和发送报文.因特网运输层将所提供的服务整合成两种 ...
- JVM 调优
JVM内存,由三个部分构成 年轻代+老年代+永久代: 需要调试的是年轻代和老年代 的参数: 先解释几个JVM参数: -XMx : 最大可用内存: -Xms:初始化内存: -xss: 线程栈 的大小: ...
- xcode设置项目图标玻璃镜效果
xcode5中设置 ios6和ios7的适配一些小细节注意,ios6中图标会默认的设置玻璃镜效果 找到图片文件夹APPlcon中右侧设置中的有个iOS icon is pre-rend-rendere ...
- Android Market 分析【安卓市场】
安卓市场: 通过对表的分析,“下载任务”的数据来源于数据库[app_download],“已安装”的数据来源于数据库[software_installed]. 数据分析:----- bash-3.2# ...
- [每日一题] OCP1z0-047 :2013-08-14 如何理解USING INDEX?...................................41
正确答案:B 一.USING INDEX的实验: .USING INDEX可以让你在创建主键.唯一性约束的时候使用指定的索引或创建索引.或修改索引的存储结构. OK,我先不用USING INDEX,创 ...
- PHP自学之路---报表及绘图技术
Ø 报表 a) 什么是报表 报表就是用表格.图表等格式来动态显示数据. b) PHP绘图坐标系 1. 坐标系介绍 下图说明了PHP坐标系.坐标原点位于左上角,以像素为单 ...
- [Angular 2] Template property syntax
This lesson covers using the [input] syntax to change an element property such as “hidden” or “conte ...
- SVN Checkout 不包括源文件夹根目录(转)
SVN Checkout 不包括源文件夹根目录,比如我要checkout trunk/ 下面的所有文件,但是不包括trunk 文件夹 我们可以在svn文件夹后面打个空格,在加个“.”就行了 eg: ...