JS 遍历数组,遍历对象遇到的坑

最近在项目中发现了一些遍历数组,对象时遇到的坑,一起来看看..

一、遍历数组

(1) forEach 不能跳出循环 (return, break, continue失效)

var arr = [1,2,3];
arr.forEach(i => {
  console.log(i);
  if (i === 2) return;
});
// 输出结果:
// 1
// 2
// 3

当时我就懵了,居然全部都输出了。然后继续测试,发现return, break, continue 都失效; 原以为forEach可以减少一些代码,发现不能跳出循环后,果断不用了,应用场景限制了太多。


2018-01-04 更新
(1) forEach 里面可以使用return, 会立即跳出当前循环, 继续执行下一个循环。 在函数中也是如此, 不会作为函数结果直接返回。
(2)forEach 中不支持 break, continue 关键字。其实, continue可以用return实现;break 跳出整个循环建议用 原生的for循环, 或者es6 的 for … of 实现。


(2) 同理 map循环,不能中断遍历

var arr = [1,2,3];
var newArr = arr.map(i => {
  console.log(i);
  if (i === 2) return i;
});
console.log(newArr);
// 输出结果
// 1
// 2
// 3
// [undefined, 2, undefined]

跟预期一样, map循环也不能终止遍历, 好在return语句生效了, 在newArr里有返回值。 另外,break,continue依然失效。

(3) for of循环, es6 遍历神器

var arr = [1, 2, 3];
for (let i of arr) {
  console.log(i);
  if (i === 2) break;
}
// 输出结果
// 1
// 2

for of 可以跳出循环了, 而且语法相对原始的for循环来说简洁一些, 支持return(函数里用), break, continue; 注意是es6的,nodejs可以用,前端就要转下了。

二、遍历对象

(1) for in 可以跳出循环

var obj = {name: 'bob', age: 25, gender: 'male'};
for (let key in obj) {
  console.log(key);
  if (key === 'age') break;
}
// 输出结果:
// name
// age

很不错, for in 可以跳出循环, 但是坑在后面..

(2) for in 会遍历原型对象上的属性

var obj = {name: 'bob', age: 25, gender: 'male'};
obj.__proto__.test = 'test prototype';
for (let key in obj) {
  console.log(key);
}
// 输出结果:
// name
// age
// gender
// test

我们发现for … in 会遍历对象原型链上的属性,有时候是意想不到的错误。 解决方法: 判断是否自身属性即可, obj.hasOwnProperty()。

var obj = {name: 'bob', age: 25, gender: 'male'};
obj.__proto__.test = 'test prototype';
for (let key in obj) {
  if (obj.hasOwnProperty(key))
    console.log(key);
}
// 输出结果:
// name
// age
// gender

三、总结

(1) 遍历数组,在前端尽量用原始的for循环, 如果有支持es6,就用for … of; node端用for of,简洁。
(2) forEach, map 根据实际场景使用,注意上面的坑。
(3) 遍历对象用 for … in 注意增加判断 hasOwnProperty。

JavaScript遍历数组可以通过使用for循环来实现。可以使用以下代码来遍历数组并生成对象: ```javascript var arr = [1, 2, 3, 4, 5]; var obj = {}; for (var i = 0; i < arr.length; i++) { obj[arr[i]] = i; } console.log(obj); ``` 上述代码首先创建了一个空对象`obj`。然后,通过for循环遍历数组`arr`,将数组的每个元素作为对象`obj`的键,对应的索引作为值。最后,打印输出对象`obj`。 这样,你就可以使用JavaScript遍历数组生成对象了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [JS遍历数组对象的区别及递归遍历对象数组、属性的方法详解](https://download.csdn.net/download/weixin_38746018/13004197)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [JavaScript遍历数组对象的元素简单操作示例](https://download.csdn.net/download/weixin_38576811/13209524)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [使用Python的Requests、Selenium和BeautifulSoup结合的爬虫示例代码,用于爬取带有分页的动态网页](https://download.csdn.net/download/weixin_44609920/88225628)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值