以下代码,那一部分运行快

上半部分代码块:

javascript复制代码

ini 复制代码
const arr1 = [];
for (let i = 0; i < 1000000; ++i) {
  arr1[i] = 1;
}

下半部分代码块:

javascript复制代码

ini 复制代码
const arr2 = [];
arr2[1000000 - 1] = 1;
for (let i = 0; i < 1000000; ++i) {
  arr2[i] = 1;
}

总结:

  • 上半部分代码效率更高,因为它利用了数组的快速模式。
  • 下半部分代码 由于先设置了 arr2[1000000 - 1],导致数组失去了快速模式的优势,降低了效率。

测试代码:

javascript复制代码

ini 复制代码
// 测试代码
console.time('a');
const arr1 = [];
for (let i = 0; i < 1000000; ++i) {
  arr1[i] = 1;
}
console.timeEnd('a');

console.time('b');
const arr2 = [];
arr2[1000000 - 1] = 1;
for (let i = 0; i < 1000000; ++i) {
  arr2[i] = 1;
}
console.timeEnd('b');

JS运行机制:

浏览器 内核 JS解析引擎
Chrome 早期 WebKit,现目前 Blink V8
Mozilla Firefox Gecko SpiderMonkey
Edge Chromium Chakra / V8
Safari Webkit JavascriptCore

补充说明:

  • 比较主流的JS引擎是V8,这里假设是跑在Chrome或Node上,用的是V8引擎。
  • V8引擎利用隐藏类(Hidden Class)的方式来存放JS对象,并且数组有快速模式(Fast Mode)和字典模式(Dictionary Mode)。
  • 在快速模式下,数组的索引是连续的,并且类型是一致的,这样可以提高访问和赋值的效率。
  • 一旦数组的索引不连续(如 arr2[1000000 - 1] = 1),数组就会失去快速模式的优势,转而使用字典模式,效率降低。
  • 因此,左边代码生成的数组保持在快速模式,而右边代码生成的数组由于索引不连续而失去了快速模式的优势,导致左边代码性能更好。
  • 指导代码编写习惯:定义数组时,尽可能保持索引连续,避免使用非连续索引赋值。
相关推荐
星月心城几秒前
八股文-JavaScript(第一天)
开发语言·前端·javascript
政采云技术2 分钟前
深入理解 Webpack5:从打包到热更新原理
前端·webpack
T___T4 分钟前
从入门到实践:React Hooks 之 useState 与 useEffect 核心解析
前端·react.js·面试
山有木兮木有枝_5 分钟前
当你的leader问你0.1+0.2=?
前端
前端程序猿之路8 分钟前
模型应用开发的基础工具与原理之Web 框架
前端·python·语言模型·学习方法·web·ai编程·改行学it
名字被你们想完了9 分钟前
Flutter 实现一个容器内部元素可平移、缩放和旋转等功能(八)
前端·flutter
听风说图9 分钟前
Figma画布协议揭秘:组件系统的设计哲学
前端
sure2829 分钟前
在react native中实现短视频平台滑动视频播放组件
前端·react native
weibkreuz11 分钟前
React开发者工具的下载及安装@4
前端·javascript·react
代码猎人11 分钟前
link和@import有什么区别
前端