避免双重求值

有四个标准函数可以允许你传入代码的字符串,然后它才你动态执行。它们分别是:eval、Function、setTimeout、setInterval

事实上当你在javascript代码中执行另外一段javascript代码时,都会导致双重求值的性能消耗,所以在大多数情况下,没必要使得eval和Function函数,因此最好避免使用它们。至于setTimeout和setInterval,建议传入函数而不是字符串来作为第一个参数

现在Safari4和chrome的javaScript引擎会缓存住那些使用了eval且重复运行的代码,这也是一个性能提升点。

使用Object/Array直接量

使用直接量的两大好处

  1. 运行速度更快
  2. 节省代码量、减少文件尺寸(事实上对象属性或者数组项数量越多,使用直接量的好处就越明显)

不要重复工作

有两种方法避免重复工作

  1. 延迟加载
  2. 条件预加载

以一个例子来说明吧

        function addHandler(target,eventType,handler) {if (target.addEventListener) {//DOM2 Eventstarget.addEventListener(eventType, handler, false);} else {//IEtarget.attachEvent('on' + eventType, handler);}}function removeHandler(target, eventType, handler) {if (target.removeEventListener) {//DOM2 Eventstarget.removeEventListener(eventType, handler, false);} else {//IEtarget.detachEvent('on' + eventType, handler);}}

事实上页面一加载,你就知道用户是使用的哪种浏览器,但是这时候如果页面上有100个元素需要添加事件绑定就需要判断100次(而本身事实上你只需要去判断一次)

下面使用延迟加载的方式来试试

        function addHandler(target, eventType, handler) {if (target.addEventListener) {//DOM2 EventsaddHandler = function (target, eventType, handler) {target.addEventListener(eventType, handler, false);}} else {//IEaddHandler = function (target, eventType, handler) {target.attachEvent('on' + eventType, handler);}}addHandler(target, eventType, handler);//调用新的函数
        }function removeHandler(target, eventType, handler) {if (target.removeEventListener) {//DOM2 EventsremoveHandler = function (target, eventType, handler) {target.removeEventListener(eventType, handler, false);}} else {//IEremoveHandler = function (target, eventType, handler) {target.detachEvent('on' + eventType, handler);}}removeHandler(target, eventType, handler);//调用新的函数}

调用延迟加载函数时,第一次会相对慢些,后面每次调用时都会很快,所以当一个函数在页面中不会立即调用时,延迟加载是最好的选择

另外一种方式是使用条件预加载:会在脚本加载期间提单检测,而不会等到函数被调用

        var addHandler = document.body.addEventListener ?function (target, eventType, handler) {target.addEventListener(eventType, handler, false);} :function (target, eventType, handler) {target.attachEvent('on' + eventType, handler);};var removeHandler = document.body.removeEventListener ?function (target, eventType, handler) {target.removeEventListener(eventType, handler, false);} :function (target, eventType, handler) {target.detachEvent('on' + eventType, handler);};

位操作

javascript中的数字都是以64位格式进行存储的,在位操作中,数字被转换为有符号32位格式,每次运算都是直接操作该32位数得到结果,事实上javascript位操作比其它数学运算和布尔运算操作都要快

举例来说明一下

1、对2取模,一般性的大家会如下这样写

        if (i % 2) {//是奇数} else {//是偶数}

但下面这样写会更快些

        if (i & 1) {//是偶数} else {//是奇数}

2、位掩码(也就是使用单个数字的每一位来判定是否选项成立,从而有效的把数字转换为由布尔值标记组成的数组)示例代码如下所示

        var OPTION_A = 1;var OPTION_B=2;var OPTION_C = 3;var OPTION_D = 4;var options = OPTION_A | OPTION_B | OPTION_C | OPTION_D;if (options&OPTION_A) {//选项a在列表中,进行处理processing
        }if (options & OPTION_B) {//选项b在列表中,进行处理processing}

使用原生方法

无论你的javascript如何优化,都不会比js引擎提供的原生方法更快,原因很简单这些原生方法在你写代码之前就已经存在浏览器中了,并且是使用低级语言写的,这就说明这些代码已经被编译成机器码成为浏览器的一部分了,启能不比你的代码快?

小结

高性能JavaScript笔记三(编程实践)相关推荐

  1. 读书笔记: Unix编程实践教程

    目录 第1章 Unix系统编程概述 第2章 用户.文件操作与联机帮助:编写who命令 第3章 目录与文件属性:编写ls 第4章 文件系统:编写pwd 第5章 连接控制:学习stty 第6章 为用户编程 ...

  2. [高性能javascript笔记]1-加载和执行

    2019独角兽企业重金招聘Python工程师标准>>> 无论是外链还是内链,<script>标签每次出现都霸道地让页面等待脚本的解析和执行.这是页面生存周期的必要环节,因 ...

  3. CUDA编程(三) —— 编程实践

    1. 将两个元素数目为1024×1024的float数组相加 首先我们思考一下如果只用CPU我们怎么串行完成这个任务 #include <iostream> #include <st ...

  4. 郑捷《机器学习算法原理与编程实践》学习笔记(第四章 推荐系统原理)(三)SVD...

    4.5.1 SVD算法回顾 A = U∑VT 其中:A是N*M的矩阵,U是M*M的方阵(里面向量正交,称为左奇异向量),∑是一个M*N的矩阵,VT是一个N*N的矩阵(里面向量正交,右奇异向量) 那么奇 ...

  5. WDK李宏毅学习笔记第三周02_高斯分布与逻辑回归编程实践

    第一周学过的机器学习知识的总结与实践 摘要 在第一周知道了机器学习是什么,以及用Regression解决预测问题,用高斯分布和逻辑回归解决分类问题,以及在解决这些问题时用到的梯度下降算法.为了加深理解 ...

  6. 《高性能JavaScript》(读书笔记)

    这次主要是对<高性能JavaScript>一书的读书笔记,记录下自己之前没有注意到或者需要引起重视的地方 第一章 加载和执行 js代码在执行过程中会阻塞浏览器的其他进程,比如用户界面的绘制 ...

  7. 高性能JavaScript 读书笔记

    第一章:加载和执行 浏览器的JavaScript的引擎是编译器层的优化: 当浏览器执行JavaScript代码时,不能同时做其他任何事情(单一进程),意味着<script>标签每次出现都霸 ...

  8. 【读书笔记】《高性能JavaScript》

    缺陷 这本书是2010年出版的,这本书谈性能是有时效性的,现在马上就2018年了,这几年前端发展的速度是飞快的,书里面还有一些内容考虑IE6.7.8的东西,殊不知现在这些都已经不再考虑了,所以不可避免 ...

  9. 《Java并发编程实践》学习笔记之一:基础知识

    <Java并发编程实践>学习笔记之一:基础知识 1.程序与进程 1.1 程序与进程的概念 (1)程序:一组有序的静态指令,是一种静态概念:  (2)进程:是一种活动,它是由一个动作序列组成 ...

最新文章

  1. java 基础学习——基本语法(三)
  2. ASP.NET Core Identity 实战(1)——Identity 初次体验
  3. (十)、java内部类与内部类的闭包和回调
  4. 计算机控制系统脉冲传递函数,第6.2课 (理解)计算机控制系统理论基础—脉冲传递函数.pdf...
  5. mysql中%3c%3e和=_Grafana+Prometheus 监控 MySQL
  6. 编写数据驱动的单元测试的代码
  7. 通向码农的道路(enet开源翻译计划 二)
  8. 基于visual Studio2013解决C语言竞赛题之1030计算函数
  9. 【D】分布式系统的CAP理论
  10. 数据分析之A股市场技术分析是否可行
  11. 不用任何软件!PDF转Word用微信这个功能,简单又方便!
  12. 第17课:生活中的享元模式——颜料很贵必须充分利用
  13. skb_buff结构体解析
  14. JavaSE学习笔记 详解Set集合中实现类:LinkedHashSet以及TreeSet
  15. 基于taro开发微信小程序
  16. 罗技 UE3100 蓝牙耳机使用
  17. Fiddler的入门使用
  18. QQ音乐播放器-jQuery实现
  19. 浏览器缓存机制(1)
  20. php7.0 freetype_php 添加 freetype支持

热门文章

  1. Linux下使用终端调试Python程序:pudb
  2. mxnet报错解决:AttributeError: module 'mxnet.context' has no attribute 'num_gpus'
  3. ubuntu16.04: mininet下使用ryu当做控制器
  4. java 泛型反射_Java使用反射来获取泛型信息示例
  5. exp导oracle数据库,使用exp/imp 在oracle数据库间导数据
  6. vue 表格左右拖拽调整列宽_解决 | iview低版本实现表格拖拽,滚动条列宽计算问题...
  7. golang json 获取所有key_Golang —— JSON 大法
  8. foreign 磁盘阵列_服务器磁盘 foreign
  9. Java日志体系总结
  10. 常见的 IO 模型有哪些?Java 中 BIO、NIO、AIO 的区别?