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.这些都不是关键,关键是服 ...
随机推荐
- 解密HOMS
一个可以做证券账户多账户和子账户管理软件.早年是提供给基金或者机构使用的,毕竟传统印象中,也只有他们有多个账户需要汇集.单一账户需要拆分. 本来作为专业的工具,在小范围内传播,和大众也没多大关系,行业 ...
- Prefix.pch的作用和用法
一般用于放置宏,省去xcode编译的时间 Hello World_Prefix.pch:扩展名.pch表示"precompiled header",这是一个你工程要用到的来自于外部 ...
- 第一篇:数据工程师眼中的智能电网(Smart Grid)
前言 想必第一次接触到智能电网这个概念的人,尤其是互联网从业者,都会顾名思义的将之理解为"智能的电网". 然而智能电网中的"智能"是广义上的智能,它就是指更好的 ...
- iOS 短信验证码倒计时按钮的实现
验证码倒计时按钮的应用是非常普遍的,本文介绍了IOS实现验证码倒计时功能,点击获取验证码,进入时间倒计时,感兴趣的小伙伴们可以参考一下: 实现思路: 创建按钮,添加点击方法: 用NSTimer定时器, ...
- Eclipse中使用git把项目导入到osc@git中
方便Eclipse用户使用Git把项目导入到osc@git中进行管理. Eclipse Git osc@git 一.原有项目: 项目名为TestGit 二.在osc@git上面创建一个新项目库. 填 ...
- fluentd结合kibana、elasticsearch实时搜索分析hadoop集群日志<转>
转自 http://blog.csdn.net/jiedushi/article/details/12003171 Fluentd是一个开源收集事件和日志系统,它目前提供150+扩展插件让你存储大数据 ...
- Day1 - Python基础1 介绍、基本语法、流程控制
Python之路,Day1 - Python基础1 本节内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc是个什么鬼 ...
- codevs 3336 电话网络
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #defin ...
- firebug中console命令尝试
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 解决 SQLSERVER 2008 无法删除作业
SQLSERVER 2008 中删除作业时遇到无法删除 解决办法: USE [msdb] ) SET @job_name = N'JobName' --注:jobName为维护计划对应的jobName ...