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.这些都不是关键,关键是服 ...
随机推荐
- android快捷简单的实现音乐播放器
自己做了一个相对完整的音乐播放器,现在把播放模块提取出来,分享给大家.音乐播放器基本功能都实现了的,可能有些BUG,希望谅解. 播放器功能如下: 1.暂停,播放 2.拖动条实现,快进,快退 3.歌词同 ...
- 记录下mybatis中#{}和${}传参的区别
最近在用mybatis,之前用过ibatis,总体来说差不多,不过还是遇到了不少问题,再次记录下, 比如说用#{},和 ${}传参的区别, 使用#传入参数是,sql语句解析是会加上"&quo ...
- js中正则表达式的使用
1,作用:匹配一个字符串中的一些内容2,声明和使用: 1),构造函数 var reg=new RegExp(/表达式/) 2),字面量 var reg=/表达式/ 推荐使用 eg: var reg=/ ...
- Miller-Rabin质数测试
Miller-Rabin质数测试 本文主要讨论使用Miller-Rabin算法编写素数的判定算法,题目来源于hihocoder. 题目 题目要求 时间限制:10000ms 单点时限:1000ms 内存 ...
- 在树莓派1B上编译安装lnmp服务器
最近一周给部门内部搭建考试系统,选择使用PHPEMS.这是个开源的系统,唯一缺点是PHP的版本比较低,只能使用5.2或5.3.而我的树莓派系统更新后使用apt-get安装得到的PHP版本为5.4.由于 ...
- Android基础笔记(十四)- 内容提供者读取联系人
利用内容提供者读取联系人 利用内容提供者插入联系人 内容观察者的原理 利用内容观察者监听系统应用数据库或者自己应用数据库的变化 利用内容提供者读取联系人 读取联系人相对于读取短信来说就复杂非常多了,我 ...
- ie11只能用管理员身份打开解决办法
解决IE11只能用管理员身份运行的问题 不知道大家有没有遇到这种情况,在毫不知情的情况下 IE11 突然打不开了,必须要用管理员身份运行才可以打开,而且重置浏览器这个方法也不奏效. 今天本人也遇到了, ...
- 边走边学Nodejs (基础入门篇)
1.什么是Node.js Nodejs ,或者node, 是一个基于ChromeJavaScript执行时建立的平台.用于方便地搭建响应速度快.易于扩展的网络应用.Node.js 使用事件驱动, 非堵 ...
- javabean、DTO、VO
一.javabean 一. javabean 是什么? Bean的中文含义是“豆子”,顾名思义,JavaBean是指一段特殊的Java类, 就是有默然构造方法,只有get,set的方法的java类的对 ...
- ASP.NET-FineUI开发实践-13(一)
开原版好像是没有gird树,有一个扩展列下的模拟树列,就是不能展开,专业版有,开原版我弄了弄,思路是有,就是不是很好实现.这篇博客直接写出了(一)说明一个肯定是写不完的. FineUI重在封装,改这个 ...