答案其实是:for(倒序)
最让我感到惊讶的事情是,当我在本地计算机上进行测试之后,我不得不接受 for(倒序)是所有 for 循环中最快的这一事实。下面我会举个对一个包含超过一百万项元素的数组执行一次循环遍历的例子。
声明:console.time() 结果的准确度在很大程度上取决于我们运行测试的系统配置。你可以在此处对准确度作进一步了解。
- const million = 1000000;
- const arr = Array(million);
- console.time('⏳');
- for (let i = arr.length; i > 0; i--) {} // for(倒序) :- 1.5ms
- for (let i = 0; i < arr.length; i++) {} // for :- 1.6ms
- arr.forEach(v => v) // foreach :- 2.1ms
- for (const v of arr) {} // for...of :- 11.7ms
- console.timeEnd('⏳');
造成这样结果的原因很简单,在代码中,正序和倒序的 for 循环几乎花费一样的时间,仅仅相差了 0.1 毫秒。原因是,for(倒序)只需要计算一次起始变量 let i = arr.length,而在正序的 for 循环中,它在每次变量增加后都会检查条件 i
而 forEach 是 Array 原型的一个方法,与普通的 for 循环相比,forEach 和 for…of 需要花费更多的时间进行数组迭代。(译者注:但值得注意的是,for…of 和 forEach 都从对象中获取了数据,而原型并没有,因此没有可比性。)
我想,也许大家都应该对这个基础循环非常熟悉了。我们可以在任何我们需要的地方使用 for 循环,按照核定的次数运行一段代码。最基础的 for 循环运行最迅速的,那我们每一次都应该使用它,对吗?并不然,性能不仅仅只是唯一尺度,代码可读性往往更加重要,就让我们选择适合我们应用程序的变形即可。
这个方法需要接受一个回调函数作为输入参数,遍历数组的每一个元素,并执行我们的回调函数(以元素本身和它的索引(可选参数)作为参数赋予给回调函数)。forEach 还允许在回调函数中使用一个可选参数 this。
- const things = ['have', 'fun', 'coding'];
- const callbackFun = (item, idex) => {
- console.log(`${item} - ${index}`);
- }
- things.foreach(callbackFun);
- /* 输出
- have - 0
- fun - 1
- coding - 2
- */
for…of 是在 ES6(ECMAScript 6)中实现标准化的。它会对一个可迭代的对象(例如 array、map、set、string 等)创建一个循环,并且有一个突出的优点,即优秀的可读性。
- const arr = [3, 5, 7];
- const str = 'hello';
- for (let i of arr) {
- console.log(i); // 输出 3, 5, 7
- }
- for (let i of str) {
- console.log(i); // 输出 'h', 'e', 'l', 'l', 'o'
- }
需要注意的是,请不要在生成器中使用 for……of,即便 for……of 循环提前终止。在退出循环后,生成器被关闭,并尝试再次迭代,不会产生任何进一步的结果。
for…in 会在对象的所有可枚举属性上迭代指定的变量。对于每个不同的属性,for…in 语句除返回数字索引外,还将返回用户定义的属性的名称。因此,在遍历数组时最好使用带有数字索引的传统 for 循环。因为 for…in 语句还会迭代除数组元素之外的用户定义属性,就算我们修改了数组对象(例如添加自定义属性或方法),依然如此。
- const details = {firstName: 'john', lastName: 'Doe'};
- let fullName = '';
- for (let i in details) {
- fullName += details[i] + ' '; // fullName: john doe
- }
for…of 和 for…in
for…of 和 for…in 之间的主要区别是它们迭代的内容。for…in 循环遍历对象的属性,而 for…of 循环遍历可迭代对象的值。
- let arr= [4, 5, 6];
- for (let i in arr) {
- console.log(i); // '0', '1', '2'
- }
- for (let i of arr) {
- console.log(i); // '4', '5', '6'
- }
1.我手机掉进厕所了怎么办?是屎在给我发信息吗? 2.生活就像新闻联播,不是换...
Knative 是基于 Kubernetes 的开源 Serverless 应用编排框架。阿里云 Knative 在...
?又到一年毕业季,即将开启(实习及正式)职场生涯的同学们会有不少疑惑。比如,...
作者 许力 阿里云原生多模数据库Lindorm与东软云科技推出联合解决方案 共建面向...
数据目录已成为企业数据管理策略的重要组成部分,但选择合适的数据目录并不是简...
我们将创建以下三个Shell脚本来锁定和解锁多个帐户和查看账号状态。 创建锁定用...
1.男女之间是真的可以有纯友谊的,只要一个打死不说一个装傻到底。 2.不要迷恋...
1.世界上最悲哀的事莫过于睡眠不足,尤其是在感冒的时候。 2.我是一个很有原则...
新冠肺炎疫情的全球大流行不仅深刻影响了世界政治经济格局的发展演进,而且加速...
年味到底是什么?不同的时代,人们迎接春节的方式也在变换。 在70后的眼里,年味...