针对循环体变量声明与初始化的效率问题,将执行的简单测试代码如下:

function test(n) {
    console.time('Internally initialized');
    for (var i = 0; i < n; i++) {
        let a = i;
    }
    console.timeEnd('Internally initialized');

    console.time('Externally initialized');
    let a = 0;
    for (var i = 0; i < n; i++) {
        a = i;
    }
    console.timeEnd('Externally initialized');

    console.time('Externally declared');
    let b;
    for (var i = 0; i < n; i++) {
        b = i;
    }
    console.timeEnd('Externally declared');
}

Chromium 58.0.3029.110下的测试结果,没有考虑更多的测试条件、环境因素影响等等:

test(1000000000)
Script snippet #2:6 Internally initialized: 2894.2080078125ms
Script snippet #2:13 Externally initialized: 2867.099853515625ms
Script snippet #2:20 Externally declared: 2895.260986328125ms
undefined
test(100000000)
Script snippet #2:6 Internally initialized: 355.6640625ms
Script snippet #2:13 Externally initialized: 296.761962890625ms
Script snippet #2:20 Externally declared: 296.949951171875ms
undefined
test(10000000)
Script snippet #2:6 Internally initialized: 68.672119140625ms
Script snippet #2:13 Externally initialized: 43.97705078125ms
Script snippet #2:20 Externally declared: 35.217041015625ms
undefined
test(1000000)
Script snippet #2:6 Internally initialized: 12.23388671875ms
Script snippet #2:13 Externally initialized: 10.057861328125ms
Script snippet #2:20 Externally declared: 8.0849609375ms
undefined
test(100000)
Script snippet #2:6 Internally initialized: 0.94873046875ms
Script snippet #2:13 Externally initialized: 1.088134765625ms
Script snippet #2:20 Externally declared: 0.931884765625ms
undefined
test(10000)
Script snippet #2:6 Internally initialized: 0.1181640625ms
Script snippet #2:13 Externally initialized: 0.176025390625ms
Script snippet #2:20 Externally declared: 0.145751953125ms
undefined
test(1000)
Script snippet #2:6 Internally initialized: 0.044921875ms
Script snippet #2:13 Externally initialized: 0.04296875ms
Script snippet #2:20 Externally declared: 0.046875ms
undefined
test(100)
Script snippet #2:6 Internally initialized: 0.025146484375ms
Script snippet #2:13 Externally initialized: 0.033935546875ms
Script snippet #2:20 Externally declared: 0.02783203125ms
undefined
test(10)
Script snippet #2:6 Internally initialized: 0.024169921875ms
Script snippet #2:13 Externally initialized: 0.024169921875ms
Script snippet #2:20 Externally declared: 0.02197265625ms
undefined
test(1)
Script snippet #2:6 Internally initialized: 0.02490234375ms
Script snippet #2:13 Externally initialized: 0.032958984375ms
Script snippet #2:20 Externally declared: 0.030029296875ms
undefined

Firefox 54.0下的测试结果,没有考虑更多的测试条件、环境因素影响等等:

test(1000000000)
Internally initialized: 计时器开始
Internally initialized: 768.81ms
Externally initialized: 计时器开始
Externally initialized: 697.8ms
Externally declared: 计时器开始
Externally declared: 704.16ms
undefined
test(100000000)
Internally initialized: 计时器开始
Internally initialized: 131.84ms
Externally initialized: 计时器开始
Externally initialized: 84.42ms
Externally declared: 计时器开始
Externally declared: 70.98ms
undefined
test(10000000)
Internally initialized: 计时器开始
Internally initialized: 19.92ms
Externally initialized: 计时器开始
Externally initialized: 17.09ms
Externally declared: 计时器开始
Externally declared: 15.33ms
undefined
test(1000000)
Internally initialized: 计时器开始
Internally initialized: 3.46ms
Externally initialized: 计时器开始
Externally initialized: 3.06ms
Externally declared: 计时器开始
Externally declared: 2.75ms
undefined
test(100000)
Internally initialized: 计时器开始
Internally initialized: 1.49ms
Externally initialized: 计时器开始
Externally initialized: 1.11ms
Externally declared: 计时器开始
Externally declared: 2.14ms
undefined
test(10000)
Internally initialized: 计时器开始
Internally initialized: 1.03ms
Externally initialized: 计时器开始
Externally initialized: 1.11ms
Externally declared: 计时器开始
Externally declared: 1.11ms
undefined
test(1000)
Internally initialized: 计时器开始
Internally initialized: 1.25ms
Externally initialized: 计时器开始
Externally initialized: 0.84ms
Externally declared: 计时器开始
Externally declared: 0.82ms
undefined
test(100)
Internally initialized: 计时器开始
Internally initialized: 1.29ms
Externally initialized: 计时器开始
Externally initialized: 1.02ms
Externally declared: 计时器开始
Externally declared: 1.21ms
undefined
test(10)
Internally initialized: 计时器开始
Internally initialized: 1.29ms
Externally initialized: 计时器开始
Externally initialized: 1.1ms
Externally declared: 计时器开始
Externally declared: 1.64ms
undefined
test(1)
Internally initialized: 计时器开始
Internally initialized: 1.15ms
Externally initialized: 计时器开始
Externally initialized: 0.97ms
Externally declared: 计时器开始
Externally declared: 0.89ms
undefined

三种方式无明显差别。从一般性逻辑来分析,声明和初始化是两种操作,其中任何一种操作发生的次数越多耗时越多;但变量声明时就及时初始化是个好的编程习惯,未初始化的变量就直接参与运算常常会得到意想不到的结果,如(undefined) + 1 = NaN、(undefined) + 'string' = "undefinedstring",当然很多编程语言对于未初始化的变量以默认类型值初始化,而Javascript默认值为undefined。另外,这里不探讨存储性能和垃圾回收机制。

关于Javascript循环体变量声明与初始化的效率问题的更多相关文章

  1. JavaScript中变量声明有var和没var的区别

    JavaScript中变量声明有var和没var的区别 JavaScript中有var和没var的区别 Js中的变量声明的作用域是以函数为单位,所以我们经常见到避免全局变量污染的方法是 (functi ...

  2. javascript的变量声明、数据类型

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. JavaScript 基础 (变量声明, 数据类型, 控制语句)

    创建: 2017/09/16 更新: 2017/09/24 更改标题 [JavaScript 概要]-> [JavaScript 基础] 完成: 2017/09/25 更新: 2017/10/0 ...

  4. javascript的变量声明和数据类型

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. JavaScript中变量声明以及数据类型

    JavaScript变量 变量名必须以字母或下划线("_")开头 变量也能以 $ 和 _ 符号开头(不过我们不推荐这么做) 变量名称对大小写敏感(y 和 Y 是不同的变量) 变量可 ...

  6. 【C++】const,static和static const类型成员变量声明及其初始化

    1)const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间 void f1() { ; cout<<x<<endl; ...

  7. C++ static、const和static const类型成员变量声明以及初始化

    C++ static.const和static const 以及它们的初始化 const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间. sta ...

  8. javascript:变量声明&&赋值的提升和函数声明&&定义的提升在不同情况下的表现

    console.log(a); //undefined console.log(show); //函数的定义 show();         //aaa123 var a = 1; function ...

  9. JavaScript中变量声明效率问题

    1 var theString1 = "字符串1"; var theString2 = "字符串1"; var theString3 = "字符串1& ...

随机推荐

  1. smart beta

    本文来至人大经济论坛,http://bbs.pinggu.org/thread-3151691-1-1.html 众所周知,beta在CAPM模型中衡量了相对于持有整个市场所带来的风险溢价(risk ...

  2. HTML5 拖放(Drag 和 Drop)功能开发——基础实战

    随着HTML5的普及度越来越高,现在写代码也遇到一些了,经过同事的点播开展了一次Dojo活动用以技术交流,我也乘此机会将HTML5的拖放功能整理了一下. 简介 拖拽(Drag/Drop)是个非常普遍的 ...

  3. fgets()函数以及fputs()函数

    fgets() fgets() 该函数是一个文件操作相关的函数 暂时使用这个函数可以从键盘接收一个字符串,保存到字符数组中 原来接收字符串保存到数组中的方法: char str[50]; 1) sca ...

  4. OSS.Core基于Dapper封装(表达式解析+Emit)仓储层的构思及实现

    最近趁着不忙,在构思一个搭建一个开源的完整项目,至于原因以及整个项目框架后边文章我再说明.既然要起一个完整的项目,那么数据仓储访问就必不可少,这篇文章我主要介绍这个新项目(OSS.Core)中我对仓储 ...

  5. ASP.NET MVC知识点总结

    一直都有把MVC的知识点总结出来的打算,今日终于得偿所愿.话不多说,开工!!! 一·  MVC MVC设计模式->MVC框架(前端开发框架),asp.net(webform) aspx M:Mo ...

  6. java环境安装之不能安装exe文件

    经过多年,打算再学下java 从官网下载java8安装包,但因为我的计算机的cd-room被卸载掉了,安装是报错说cab文件损坏之类的错误. 从stackOverflow中找到一篇眼前一亮的解决办法. ...

  7. Springboot(一):入门篇

    什么是spring boot spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员 ...

  8. Charles安装破解及使用

    摘要 在发开过程中,追踪请求和监控请求与返回数据是我们经常会需要的一个需求,在Mac端,Charles是一款非常易用的抓包工具. Mac端的优秀抓包工具--Charles使用 一.简介 Charles ...

  9. 响应式web-媒体查询

    响应式web-媒体查询 媒体查询是一个将很多响应式概念和工具连接在一起的粘合剂.这些查询语句都是简单但是功能很强大的,它们允许我们检测设备属性,定义规则,并根据规则等的不同加载不同的 CSS 属性.例 ...

  10. MySQL编译安装错误提示合集

    1>安装mysql在初始化的时候,出现/usr/local/mysql/bin/mysqld:error while loading shared libraries:libaio.so.1 : ...