JavaScript 用回调替换 - 性能问题

2024-02-10

在 JavaScript 中,您可以在正则表达式字符串替换操作中定义回调处理程序:

str.replace(/str[123]|etc/, replaceCallback); 

假设您有一个字符串和替换的查找对象。

var lookup = {"str1": "repl1", "str2": "repl2", "str3": "repl3", "etc": "etc" };

和这个回调函数:

var replaceCallback = function(match) { 
  if (lookup[match])
    return lookup[match]; 
  else
    return match;
}

您如何评估上述回调的表现?有没有切实可行的方法来改善?会

if (match in lookup) //....

or even

return lookup[match] || match;

导致JS编译器优化的机会,还是都是一样的?


+1 给安妮关于性能基准。

但我会和

return lookup[match] || match;

它不仅只是一次属性检索(而不是——除非优化——如前面的示例中那样两次),而且它也更短(对于较短的代码并不总是如此)clearer任何有一半经验的 JavaScript 编码员。它往往会让新手有点困惑,但你要教给新手的第一件事就是如何特殊(和优秀)|| and &&在 JavaScript 中工作,所以...

它还可以解决某些实现中的一些(非常)边缘情况。 (例子:'toString' in {}应该true[所有对象都继承toString来自Object原型],但它是false在 Microsoft 的 JScript 中。)

关于优化:除非非常明显(不要让循环条件成为一个函数,如果它可以是不变量,则必须对事物进行计数,避免不必要的重复查找),甚至没有之前是否值得担心这些东西的一般讨论你会发现一个问题(有时称为“过早优化”),对于一般 Web 的 JavaScript 来说尤其如此。不同的微优化在不同的实现中具有不同的结果,有时甚至是相互冲突的结果(“A”在 Internet Explorer 中更好,但在 FireFox 中更差,反之亦然)。大多数情况下,您需要等待,直到看到特定问题,然后解决该特定问题。

我更喜欢简单和清晰,除非我有充分的理由相信一些笨重的东西会给我带来可衡量的、现实世界的改进。

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

JavaScript 用回调替换 - 性能问题 的相关文章

随机推荐

  • state_activated预蜂窝

    你如何使用
  • 每个请求的 DbContext

    我需要为导入文件实现多线程后台作业 我已经通过后台作业 Hangfire 实现了它 但如果我使用一个线程 它会变得非常慢 该函数看起来像这样 我使用非事务单元立即保存对数据库的更改 var contactFound await contac
  • 如何在编译时检查表达式是否非法?

    我的应用程序遇到问题 我想断言函数应用程序将被编译器拒绝 有没有办法通过 SFINAE 检查这一点 例如 假设我想验证std transform to a const范围非法 这是我到目前为止所拥有的 include
  • PowerBuilder 12.5 Web 表单 - 部署时列不可编辑或丢失 Tab 键顺序

    我是一名经验丰富的 PB 开发人员 但主要使用典型的客户端 服务器架构 并且我确实遇到了问题网页表格应用程序部署到IIS7 5 using PB12 5经典 我正在创建一个可更新的数据对象 Web 服务 它在设计模式下完美工作 但是当从部署
  • 如何使用 hibernate.cfg.xml 创建数据库架构

    using lt property name hbm2ddl auto gt create lt property gt 只创建表 每当模式不存在时 hibernate 就无法创建表 因为模式不存在 Hibernate 不会为您创建模式 但
  • 使用 python 迭代时修改列表

    编辑 当我想修改原始列表时 我知道要迭代列表的副本 然而 我收到的关于在迭代列表时修改列表的错误的唯一解释是 它可能会导致意外的结果 考虑以下 lst a b c d e for x in lst lst remove x print ls
  • Windows 10 中“mvn”未被识别为内部或外部命令、可操作程序或批处理文件错误

    我读过有关此问题的类似问题 但无论如何它都不起作用 我已将 Maven 3 3 3 提取到 D Maven Java 已安装并且工作正常 然后添加了 2 个系统变量 Variable Value M2 M2 HOME bin M2 HOME
  • 我可以在端口 443 上安全地运行 Tomcat 而在 8080 上不安全地运行 Tomcat

    让我解释一下我的情况 目前 我有很多应用程序在 Tomcat 6 上运行 默认端口为 8080 我刚刚创建了一些需要登录的应用程序 我将购买 SSL 证书以安装在此服务器上 我不喜欢使用端口 8443 因为它使 URL 更加复杂 如果我在端
  • Autohotkey:重新映射 Win 键 - 单独按下时

    由于疯狂的笔记本电脑键盘布局和无法映射 Fn 组合 我想做一些重新映射 我想使用 LWin 键作为修饰符 例如 LWin Right gt End 等 它工作得很好 但是 我想在单独按下并释放时停止 LWin 以调出 Windows 菜单
  • 如何在 javascript 正则表达式匹配中将多个匹配 (/g) 与反向引用结合起来

    当使用 g 获取多个匹配 和括号 获取反向引用 时 我对正则表达式匹配返回的数组感到困惑 我不清楚如何获取反向引用 因为匹配数组的下标似乎引用了多个匹配项 而不是反向引用 例如 string abc bcd cde re2 a z p ne
  • MySQL Group By 自定义时间戳

    我想从按日期分组的数据库中获取结果 生成的元组应按日期分组 日期范围为上午 5 点到凌晨 5 点 换句话说 截止时间应该是凌晨 5 点 而不是午夜 12 点 我可以GROUP BY DAY timestamp 按正常日期分组 但如果我必须改
  • Pandas 从日期类型列获取星期几

    我正在使用 Python 3 6 和 Pandas 0 20 3 我有一列已从日期时间转换为日期类型 我所需要的只是日期 为了便于使用 我将其作为派生列 但我希望通过一周中的某一天的计算来进行一些进一步的操作 我可以从日期时间类型获取星期几
  • 更改 MKOverlayView 的 MKOverlay 坐标

    我在地图上有一个叠加层 我想更改其坐标 为了无缝地做到这一点 我将调用设置需要显示地图矩形 http developer apple com library ios documentation MapKit Reference MKOver
  • 如何增加BottomNavigationView的宽度以填充屏幕

    如何增加 BottomNavigationView 菜单的宽度 以下是当前场景 我无法增加整个屏幕的宽度 Menu xml
  • MySQL 日期时间 <-> Java 日期

    我使用 Hibernate 并且 MySQL 数据库中有一个日期时间 现在我想将 java util Date 的日期 时间存储到数据库中 所以我可以写 SimpleDateFormat df new SimpleDateFormat yy
  • 如何将 ArangoDB 嵌入桌面应用程序

    我想在我的应用程序中嵌入一个图形数据库 适用于 Windows Linux 和 MAC 我将搜索范围缩小到 ArangoDB 和 OrientDB 我能够让嵌入式 OrientDB 工作 但我仍然想尝试 ArangoDB 来做出明智的决定
  • 元组结构构造函数抱怨私有字段

    我正在开发一个基本的 shell 解释器来熟悉 Rust 在处理 shell 中存储挂起作业的表时 我遇到了以下编译器错误消息 error cannot invoke tuple struct constructor with privat
  • 请确认:Windows Workflow Foundation 现在是一匹值得支持的好马吗?

    我们正在为一家端到端使用 Microsoft 产品的公司选择工作流程解决方案 鉴于 WF4 的消息 它似乎本质上是对以前版本的重写 支持当前版本是明智之举还是我们应该寻找其他地方 即 当前版本是否太糟糕以至于我们不明智地尝试使用它 Haii
  • TensorFlow 和 Numpy 之间的不同结果

    我有以下代码片段 许多西格玛矩阵是由神经网络生成的 并且这些矩阵必须是正定的 所以这是在调试功能中检查的 奇怪的是 Sigma2 没有给出 LinAlgError Matrix is not Positive Defined Error 而
  • JavaScript 用回调替换 - 性能问题

    在 JavaScript 中 您可以在正则表达式字符串替换操作中定义回调处理程序 str replace str 123 etc replaceCallback 假设您有一个字符串和替换的查找对象 var lookup str1 repl1