零散知识点一
node版本控制
最近搞不同的项目,使用高版本node时遇到npm安装错误,发现是版本问题。为了快速进行项目切换,需要一个版本控制工具。
在网上找到两个方案,“nvm”和“n”,我选择了“n”,因为nvm这么多star也没有一个正式的1.0版本并且入门较难、使用复杂。我只是想要切换版本而已,不需要太多花里胡哨。
“n”的使用非常简单
安装
npm install -g n
安装node指定版本,如果之前已经安装过,输入版本号即可激活
n <版本号>
切换node指定版本,输入以下命令上下移动,回车切换。需要注意必须至少激活一个node版本,否则报错。
n
列出可用node版本列表
n ls
React小坑
在React官方文档中,有一个语法是在组件中可以通过箭头函数去定义方法。
class demo extends React.Component {
handle = () => {
console.log(this);
}
...
}
作为一个刚学习React语法的萌新,我被这个语法给误导了,也是因为没仔细阅读文档吧。
这并不是class和箭头函数的ES6语法,只是个实验性的语法,所以但我尝试在非组件的class定义方法的时候,它报错了。
对象池模式
最近在看React的源码,学习到了一个单例模式变种“对象池”模式。
此模式适用于大量实例化复杂可复用的对象的场景,以下是测试的栗子,可以放到控制台去观察一下性能。
const MAX=10000;
function Obj() {
this.dom=document.createElement('div');
}
function use(obj,callback) {
callback(obj);
}
function get(obj) {
return obj.dom;
}
//对象池
function test1() {
let obj=null;
for(let i=0;i<MAX;i++) {
if(!obj) {
obj = new Obj();
}
use(obj,get);
}
}
//多次new对象
function test2() {
for(let i=0;i<MAX;i++) {
const obj=new Obj();
use(obj,get);
}
}
(function start() {
setInterval(() => {
console.time('test');
// test1();
test2();
console.timeEnd('test');
},100);
})();
经过测试可以发现,实例化对象越复杂,对象池模式相对于多次实例化对象的性能越好。
但是,当MAX趋于无穷大时,相反多次实例化对象的方法反而性能更好,这可能跟浏览器的本身的垃圾回收机制有关。关于这点,可以通过下面的代码观察。
const MAX=1000000000;
function Obj() {}
function use(obj,callback) {
callback(obj);
}
function get(obj) {
return obj;
}
function test1() {
let obj=null;
for(let i=0;i<MAX;i++) {
if(!obj) {
obj = new Obj();
}
use(obj,get);
}
}
function test2() {
for(let i=0;i<MAX;i++) {
const obj=new Obj();
use(obj,get);
}
}
(function start() {
setInterval(() => {
console.time('test');
// test1();
test2();
console.timeEnd('test');
},100);
})();
很神奇,也可能是因为我实验的方法不太正确。
关于单例模式还有惰性单例很多变种,由于没有过深的研究,所以先不讨论了哈。