for 循环的 5 种写法,哪种最快?

let articleParagraphs = document.querySelectorAll(‘.article > p’);

for(let i = 0;i<articleParagraphs.length;i++){

articleParagraphs[i].classList.add(“paragraph”);

// 给class名为“article”节点下的 p 标签添加一个名为“paragraph” class属性。

}

forEach

我是ES5版本发布的。按升序为数组中含有效值的每一项执行一次 callback 函数,那些已删除或者未初始化的项将被跳过(例如在稀疏数组上)。我是 for 循环的加强版。

// 遍历数组

let arr = [1,2,3];

arr.forEach(i => console.log(i))

// logs 1

// logs 2

// logs 3

// 直接输出了数组的元素

//遍历对象

let profile = {name:“April”,nickname:“二十七刻”,country:“China”};

let keys = Object.keys(profile);

keys.forEach(i => {

console.log(i) // 对象的键值

console.log(profile[i]) // 对象的键对应的值

})

map

我也是ES5版本发布的,我可以创建一个新数组,新数组的结果是原数组中的每个元素都调用一次提供的函数后的返回值。

let arr = [1,2,3,4,5];

let res = arr.map(i => i * i);

console.log(res) // logs [1, 4, 9, 16, 25]

for…in枚举

我是ES5版本发布的。以任意顺序遍历一个对象的除Symbol以外的可枚举属性。

// 遍历对象

let profile = {name:“April”,nickname:“二十七刻”,country:“China”};

for(let i in profile){

let item = profile[i];

console.log(item) // 对象的键值

console.log(i) // 对象的键对应的值

// 遍历数组

let arr = [‘a’,‘b’,‘c’];

for(let i in arr){

let item = arr[i];

console.log(item) // 数组下标所对应的元素

console.log(i) // 索引,数组下标

// 遍历字符串

let str = “abcd”

for(let i in str){

let item = str[i];

console.log(item) // 字符串下标所对应的元素

console.log(i) // 索引 字符串的下标

}

for…of迭代

我是ES6版本发布的。在可迭代对象(包括 Array,Map,Set,String,TypedArray,arguments 对象等等)上创建一个迭代循环,调用自定义迭代钩子,并为每个不同属性的值执行语句。

// 迭代数组数组

let arr = [‘a’,‘b’,‘c’];

for(let item of arr){

console.log(item)

}

// logs ‘a’

// logs ‘b’

// logs ‘c’

// 迭代字符串

let str = “abc”;

for (let value of str) {

console.log(value);

}

// logs ‘a’

// logs ‘b’

// logs ‘c’

// 迭代map

let iterable = new Map([[“a”, 1], [“b”, 2], [“c”, 3]]

for (let entry of iterable) {

console.log(entry);

}

// logs [“a”, 1]

// logs [“b”, 2]

// logs [“c”, 3]

// 迭代map获取键值

for (let [key, value] of iterable) {

console.log(key)

console.log(value);

}

// 迭代set

let iterable = new Set([1, 1, 2, 2, 3, 3,4]);

for (let value of iterable) {

console.log(value);

}

// logs 1

// logs 2

// logs 3

// logs 4

// 迭代 DOM 节点

let articleParagraphs = document.querySelectorAll(‘.article > p’);

for (let paragraph of articleParagraphs) {

paragraph.classList.add(“paragraph”);

// 给class名为“article”节点下的 p 标签添加一个名为“paragraph” class属性。

}

// 迭代arguments类数组对象

(function() {

for (let argument of arguments) {

console.log(argument);

}

})(1, 2, 3);

// logs:

// 1

// 2

// 3

// 迭代类型数组

let typeArr = new Uint8Array([0x00, 0xff]);

for (let value of typeArr) {

console.log(value);

}

// logs:

// 0

// 255

经过第一轮的自我介绍和技能展示后,我们了解到:

  • for语句是最原始的循环语句。定义一个变量i(数字类型,表示数组的下标),按照一定的条件,对i进行循环累加。条件通常为循环对象的长度,当超过长度就停止循环。因为对象无法判断长度,所以搭配Object.keys()使用。

  • forEach ES5 提出。自称是for语句的加强版,可以发现它比for语句在写法上简单了很多。但是本质上也是数组的循环。forEach每个数组元素执行一次 callback 函数。也就是调用它的数组,因此,不会改变原数组。返回值是undefine

  • map ES5 提出。给原数组中的每个元素都按顺序调用一次 callback 函数。生成一个新数组,不修改调用它的原数组本身。返回值是新的数组。

  • for...in ES5 提出。遍历对象上的可枚举属性,包括原型对象上的属性,且按任意顺序进行遍历,也就是顺序不固定。遍历数组时把数组的下标当作键值,此时的i是个字符串型的。它是为遍历对象属性而构建的,不建议与数组一起使用。

  • for...of ES6 提出。只遍历可迭代对象的数据。

能力甄别


作为一个程序员,仅仅认识他们是远远不够的,在实际开发中鉴别他们各自的优缺点。因地制宜的使用他们,扬长避短。从而提高程序的整体性能才是能力之所在。

关于跳出循环体

在循环中满足一定条件就跳出循环体,或者跳过不符合条件的数据继续循环其它数据。是经常会遇到的需求。常用的语句是breakcontinue

简单的说一下二者的区别,就当复习好了。

  • break语句是跳出当前循环,并执行当前循环之后的语句;

  • continue语句是终止当前循环,并继续执行下一次循环;

注意forEachmap 是不支持跳出循环体的,其它三种方法均支持。

原理 :查看forEach实现原理,就会理解这个问题。

Array.prototype.forEach(callbackfn [,thisArg]{

}

传入的function是这里的回调函数。在回调函数里面使用break肯定是非法的,因为break只能用于跳出循环,回调函数不是循环体。

在回调函数中使用return,只是将结果返回到上级函数,也就是这个for循环中,并没有结束for循环,所以return也是无效的。

map() 同理。

map()链式调用

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

无论是哪家公司,都很重视基础,大厂更加重视技术的深度和广度,面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。

针对以上面试技术点,我在这里也做一些分享,希望能更好的帮助到大家。

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
e=“zoom: 33%;” />

最后

无论是哪家公司,都很重视基础,大厂更加重视技术的深度和广度,面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。

针对以上面试技术点,我在这里也做一些分享,希望能更好的帮助到大家。

[外链图片转存中…(img-gokhvSdy-1711974767332)]

[外链图片转存中…(img-0KB2MMhs-1711974767332)]

[外链图片转存中…(img-dMmLhgmO-1711974767332)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

  • 19
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值