JavaScript 中“let”和“var”之间是否存在性能差异

2023-11-24

这两个关键字在范围方面的区别已经被彻底讨论过here,但我想知道两者之间是否存在任何性能差异,如果有,它是否可以忽略不计,或者在什么时候会变得显着?


After testing this on http://jsperf.com, I got the following results: jsperf has been down for a while; see the replacing code below.

为了检查这一点,我将使用以下基于的性能测试这个答案,这促使我编写了这个函数:

/**
 * Finds the performance for a given function
 * function fn the function to be executed
 * int n the amount of times to repeat
 * return array [time for n iterations, average execution frequency (executions per second)]
 */
function getPerf(fn, n) {
  var t0, t1;
  t0 = performance.now();
  for (var i = 0; i < n; i++) {
    fn(i)
  }
  t1 = performance.now();
  return [parseFloat((t1 - t0).toFixed(3)), parseFloat((repeat * 1000 / (t1 - t0)).toFixed(3))];
}

var repeat = 100000000;
var msg = '';

//-------inside a scope------------
var letperf1 = getPerf(function(i) {
  if (true) {
    let a = i;
  }
}, repeat);
msg += '<code>let</code> inside an if() takes ' + letperf1[0] + ' ms for ' + repeat + ' iterations (' + letperf1[1] + ' per sec).<br>'

var varperf1 = getPerf(function(i) {
  if (true) {
    var a = i;
  }
}, repeat);
msg += '<code>var</code> inside an if() takes ' + varperf1[0] + ' ms for ' + repeat + ' iterations (' + varperf1[1] + ' per sec).<br>'

//-------outside a scope-----------

var letperf2 = getPerf(function(i) {
  if (true) {}
  let a = i;
}, repeat);
msg += '<code>let</code> outside an if() takes ' + letperf2[0] + ' ms for ' + repeat + ' iterations (' + letperf2[1] + ' per sec).<br>'

var varperf2 = getPerf(function(i) {
  if (true) {}
  var a = i;
}, repeat);
msg += '<code>var</code> outside an if() takes ' + varperf1[0] + ' ms for ' + repeat + ' iterations (' + varperf1[1] + ' per sec).<br>'

document.getElementById('out').innerHTML = msg
<output id="out" style="font-family: monospace;white-space: pre-wrap;"></output>

在 Chrome 和 Firefox 中测试后,这表明letvar,但仅当位于与函数主作用域不同的作用域内时。在主要范围内,var and let性能上大致相同。在 IE11 和 MS Edge 中,let and var两种情况下的性能大致相同。

按蓝色大按钮即可在您最喜欢的浏览器中亲自查看。

现在let has 仅较新的浏览器支持,但较旧的浏览器仍然被相对较多地使用,这将是通常不使用它的一个原因。如果您想在旧浏览器无法正常工作的地方使用它,那么它应该没有问题。

Edit:由于 jsperf 不起作用,因此修改了答案(请参阅旧版本的修订历史记录)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript 中“let”和“var”之间是否存在性能差异 的相关文章

  • 取消html5浏览器中的单图请求

    我正在动态加载 大 图像以绘制到 html5 画布中 如下所示 var t new Image t onload t src http myurl 但每隔一段时间就会想取消图片请求完全地 我想出的唯一方法是设置src to i e t sr
  • 在Javascript中按降序对字符串进行排序(最有效)?

    W3Schools 有这个例子 var fruits Banana Orange Apple Mango fruits sort fruits reverse 这是在 Javascript 中按降序对字符串进行排序的最有效方法吗 Updat
  • 消息“在 jest.setTimeout 指定的 5000 毫秒超时内未调用异步回调”

    我正在使用 Puppeteer 和 Jest 来运行一些前端测试 我的测试如下 describe Profile Tab Exists and Clickable settings user gt test Assert that you
  • 使用 moment.js 检查输入日期是否为星期一

    好吧 我想检查日期是否是星期一 例如 var myDate new Date moment myDate DD MM YYYY dayIs monday 在我的国家 一周的第一天是星期一 所以 我真的想检查输入日期是否是一周的开始 我尝试使
  • jQuery 选择 # id 以单词为前缀,计数器为后缀

    有没有办法用 jQuery 选择所有带有前缀 my 和后缀 0 9 的 id 像这样的 my 1 4 还是可以用循环来实现 div div div div div div div div div div 第一个想法 似乎效果很好 div i
  • jquery window.open 在 ajax 成功中被阻止

    尝试在我的 ajax 成功调用中打开一个新的浏览器窗口 但是 它被阻止为弹出窗口 我做了一些搜索 发现用户事件需要绑定到 window open 才能避免这种情况发生 我还找到了这个解决方案 您可以在 ajax 之前打开一个空白窗口 然后在
  • R 数据结构的运算效率

    我想知道是否有任何关于操作效率的文档R 特别是那些与数据操作相关的 例如 我认为向数据框添加列是有效的 因为我猜您只是向链接列表添加一个元素 我想添加行会更慢 因为向量保存在数组中C level你必须分配一个新的长度数组n 1并将所有元素复
  • 将整个包传递给雪簇

    我正在尝试并行化 使用snow parLapply 一些依赖于包 即除snow 调用函数中引用的对象parLapply必须使用显式传递给集群clusterExport 有没有办法将整个包传递到集群 而不必显式命名每个函数 包括用户函数调用的
  • javascript中按tab键时如何调用函数?

    我有一个这样的功能 function whenEmpty field if field value field style backgroundColor ffcccc alert Please fill the field field f
  • 未捕获的错误:找不到模块“jquery”

    我在用Electron https github com atom electron制作桌面应用程序 在我的应用程序中 我正在加载一个外部站点 Atom 应用程序之外 可以说http mydummysite index html http
  • Typeahead.js substringMatcher 函数说明

    我只是在做一些研究Typeahead js这是一个非常酷的图书馆 感谢文档 我已经成功地获得了一个基本的示例 该文档也非常好 但是我试图弄清楚以下代码块实际上在做什么 var substringMatcher function strs r
  • 查询为空 Node Js Sequelize

    我正在尝试更新 Node js 应用程序中的数据 我和邮递员测试过 我的开发步骤是 从数据库 MySQL 获取ID为10的数据进行更新 gt gt 未处理的拒绝SequelizeDatabaseError 查询为空 我认识到 我使用了错误的
  • 当用户单击链接时,如何记录 MixPanel 事件?

    当用户单击某种类型的链接时 我试图在 MixPanel 中记录一个事件 我正在使用 JQuery 不引人注意地完成此操作 据我所知 我需要添加一个回调函数 以便在记录事件后将用户带到 URL 这是我正在使用的代码 不幸的是
  • 如何在jquery中获取保存时间和当前时间的差异?

    我想在 javascript 或 jquery 中获取保存时间和当前时间之间的时差 我节省的时间看起来像Sun Oct 24 15 55 56 GMT 05 30 2010 java中的日期格式代码如下 String newDate 201
  • JavaScript 代码在不使用 ActiveX 的情况下截取网站屏幕截图

    我有一个用户与之交互的 JavaScript 应用程序 我需要保存当前界面的外观 裁剪出我需要的部分 或者通过指定div只拍摄我需要的部分 然后发送回服务器 显然任何外部服务都无法做到这一点 我需要一个 JavaScript 或Flash
  • Nodejs mysql 获取正确的时间戳格式

    我在用着mysqljs https github com mysqljs mysql得到结果后sql我变得不同TimeStamp格式如下 created at Sat Jul 16 2016 23 52 54 GMT 0430 IRDT 但
  • 如何将函数内的捕获错误传递给父级

    我有这几行代码示例 想知道下面的逻辑到底如何 try var response child console log why here catch err console log should show this err function c
  • 如何在 gulp.src 中使用基本正则表达式?

    我正在尝试选择两个文件gulp src highcharts js and highcharts src js 当然 我知道我可以使用数组表达式显式添加这两个表达式 但出于学习目的 我尝试为它们编写一个表达式 我读过可以使用简单的正则表达式
  • 单击列表时使用 bootstrap Dropdown 防止下拉菜单消失

    我正在使用使用引导下拉菜单 http twitter github com bootstrap javascript html dropdowns生成下拉菜单 我想防止点击菜单时菜单消失 我已经实现了以下代码 但它不起作用 知道如何修复它吗
  • 在 GWT 中,在任何主机页标记上添加事件处理程序

    我想为任何标签添加 MouseOver 事件处理程序 举个例子 我想为旧版 HTML 页面中的每个锚点页面添加事件处理程序 继GWT指南 http code google com webtoolkit doc 1 6 DevGuideUse

随机推荐

  • 使用 r 中的 ggplot 将数据框的 n 列绘制为线条

    我正在尝试重新创建 P lya 瓮模型 https en wikipedia org wiki P lya urn model 在 R 中 使用 ggplot 该模型基本上从 瓮 中的 1 个白色球和 1 个黑色球开始 然后随机选择一个球并
  • generic.xaml 文件位于哪里?

    如果你想使用默认的样式 颜色等 你需要从通用 xaml附带的文件Windows应用程序开发工具包NuGet 包 因此问题是 通用 xaml file 你可以找到默认的通用 xaml每个里面Windows应用程序开发工具包NuGet 包文件夹
  • 如何在 Xcode 8 中启用可视内存调试器?

    我将一个项目从以前版本的 Xcode 迁移到 Xcode 8 我想要的是使用新的可视内存调试器 它在新项目中可用 但在我导入的项目中完全缺失 为什么是这样 Visual Memory Debugger 似乎需要 Swift 3 才能工作 我
  • 无需 PIN/密码即可从 PKCS11 智能卡获取证书

    摘要 当在 OpenSC 上使用 JCA over PKCS11 时 提取证书时需要 PIN 我有一个需要使用智能卡签名的应用程序 该智能卡受 OpenSC 支持 因此我使用 Java 内置的 pkcs11 包装器提供程序来使用它 出于功能
  • PKG 生成字节码失败

    当我尝试运行 pkg index js t macOS 时收到此警告 节点 v17 3 1 电子邮件受保护 警告无法为文件 snapshot index js 制作字节码node17 arm64 希望有人能帮忙 我也尝试过使用 b 并得到
  • JMF更换

    JMF 很旧 不能正确支持很多编解码器 这些天我在后台使用 FFMPEG 但我想切换到本机 java 解决方案 如果存在 有人知道当前具有媒体操作功能的开源 Java 项目吗 虽然不是 100 原生 但您也可以使用Xuggler 它是一个开
  • 如何防止文档正文上的点击事件(也许是 Cordova 中的错误?)

    我是一名初学者 尝试使用 Kinetic Js 和 phonegap build 开发手机游戏 我遇到了一个我不知道如何解决的问题 我做了一些测试 我刚刚粘贴了这段代码在这里进入我的index html并将代码发送到音隙构建它从 html
  • 为什么Tomcat不会绑定关闭端口(8005)?

    Tomcat 启动并运行得很好 但从未绑定到 8005 关闭端口 所以 我只能以杀死它的方式来结束它 我正在启动 Tomcat catalina sh start or startup sh 结果是相同的 Server xml 片段
  • 当最终链接隐藏时,下载保留原始文件名的文件

    我需要下载一个文件 将其保存在一个文件夹中 同时保留网站上的原始文件名 url lt http www seg social es prdi00 idcplg IdcService GET FILE dID 187112 dDocName
  • Python xlrd:抑制警告消息

    我在用xlrd处理 Excel 文件 我正在包含许多文件的文件夹上运行脚本 并且正在打印与这些文件相关的消息 但是 对于我运行的每个文件 我还会收到以下 xlrd 生成的错误消息 WARNING OLE2 inconsistency SSC
  • 如何高效地从 HashMap 中查找和插入?

    我想做以下事情 查找一个Vec对于某个密钥 并存储它以供以后使用 如果不存在则创建一个空的Vec为键 但仍将其保留在变量中 如何有效地做到这一点 我自然认为我可以使用match use std collections HashMap Thi
  • Chrome 版本 66:阻止当前来源接收跨站点文档

    在我的本地计算机上 我一直在使用 disable web security user data dir 禁用网络安全 升级到 Chrome 版本 66 后 我开始收到阻止当前来源接收跨站点文档的警告 如何禁用此版本 chrome 的网络安全
  • 使用 ref-qualifiers 成员函数重载的调用不明确

    在编译我的代码时 我发现了一个奇怪的行为G gcc4 8 1 和MinGW4 8 2 与 std gnu 1y旗帜 本着 SSCCE 的精神 我隔离了以下片段 struct C template lt typename X gt auto
  • 确保 Linux 中应用程序的单个实例

    我正在 WxPython 中开发 GUI 应用程序 我不确定如何确保在任何给定时间机器上只有应用程序的一个副本正在运行 由于应用程序的性质 多次运行没有任何意义 并且很快就会失败 在 Win32 下 我可以简单地创建一个命名互斥体并在启动时
  • VS 2017 通过文件路径引用本地项目(就像在 VS 2015 中使用 global.json 一样)

    在 VS 2015 中 我们曾经能够在 global json 中指定本地路径 如下所示 projects src test C path to other projects 然后 它将将该路径中的所有项目添加到当前解决方案中 使我们能够轻
  • 如何在 capistrano 中使用 --trace 运行 rake?

    我希望 capistrano 使用 trace 调用 rake 这样我就可以找出它失败的原因 我该怎么做呢 set rake rake trace 不起作用 我发现的最好的方法是 set rake rake trace 这样你就不会覆盖ra
  • React JS 按升序和降序排序

    我一直在使用sortBy from lodash 但继续得到 src components Product js Syntax error Unexpected token 17 29 15 sortByPrice 16 this setS
  • PyTorch 和 CUDA 驱动程序

    我安装了 CUDA 9 2 例如 base c gt nvcc version nvcc NVIDIA R Cuda compiler driver Copyright c 2005 2018 NVIDIA Corporation Buil
  • Boost.Graph如何合并两个顶点/契约边

    如何在 Boost Graph 中合并两个顶点 契约边 我需要将边从顶点 A 移动到顶点 B 并删除顶点 A 有内置函数吗 或者adjacency list可能有一些特殊的东西 如果没有这样的功能 那为什么呢 我认为这是常见的图形操作 ED
  • JavaScript 中“let”和“var”之间是否存在性能差异

    这两个关键字在范围方面的区别已经被彻底讨论过here 但我想知道两者之间是否存在任何性能差异 如果有 它是否可以忽略不计 或者在什么时候会变得显着 After testing this on http jsperf com I got th