js是一门语法灵活的语言,对同一个操作可以有很多种不同的实现。比如if else可以用switch语句来代替等。针对这种灵活性,不同的编码方式对js的性能影响也是有很大不同的。一般来说有以下几个注意的点:

  1. 对象: 在局部函数中多次调用全局变量,可以在局部函数上下文中定义变量缓存全局变量的值。
  2. 循环:在离散值的情况下,switch语句性能优于if else.
  3. 对字符串的操作则是和不同的浏览器有关,当需要循环操作字符串时,例如for 循环执行str+=’test’5000次,ie7表现出极差的性能,这时使用array.prototype.join(‘’),将需要操作的数据都转化成数组的项而后合并字符串,可以很好的提升性能。

前几天翻译了一下谷歌关于浏览器工作原理的英文文献,今天看了高性能javascript一书,稍微记录点新的知识点。内容整体比较粗糙:

最大的原则:

  • JS和html的交互是性能昂贵的;
  • 触发浏览器重绘重排也是性能损耗大的。
    解决方案:
  1. 使用document的createDocumentFragment()方法,创建文档片段,只触发一次重排和访问一次实时dom.
  2. 缓存dom数据
  3. api 尽量选择querySelectorAll(),避免其它类似getElementById对应实时html结构的api操作
  4. 行内样式选择ele.style.cssText一次写入,充分利用浏览器自身以渲染队列处理dom重绘的性质,避免操作的时候又进行类似ele.style.color等的读取操作。
  5. 选择冒泡的方式进行全局处理事件代理,减少监听大量事件回调函数带来的任务队列性能损耗,只是这时多一层对e.target||e.srcElement的检测而已。主流的react,angular框架都多少采用了这种处理方式。
  6. 在大量操作dom的时候,临时隐藏目标dom。避免重排reflow和repaint带来的性能损耗
  7. 采用javascript创建虚拟dom

fs模块提供了node和本地资源交互的I/O接口,具体的列举如下

  1. readFile(path,callback): 读取本地文件,Unit8Array的形式存取数据,toString()方法即可将其转换成普通字符串。
  2. mkdir(filepath,callback):创建本地目录,支持’.’’../‘类似这样的相对路径创建
  3. unlink(path,callback):删除本地文件.
  4. createReadStream writeReadStream等方法
    path模块提供了获取目录及文件的多种信息,具体如下

  5. basename(),dirname(),extname()都接收一个路径作为参数,分别返回对应的文件名,目录名,后缀名

  6. resolve(rel-path),relative(path)分别接收相对路径和路径作为参数,resolve相当于linux里面shell的cd命令,realtive返回相对路径
    formidable(非核心)模块提供了处理文件上传form-data数据类型的方法。

  7. 通过设置uploadDir和调用parse的回调方法,存取目录,默认通过设置随机数+’upload_’的形式设置文件名,可以通过fs.rename(oldpath,newpath)进行重命名。