javascript - 为什么 pop() 方法在 map 方法中使用时停止工作?
问题描述
我想在不使用 reverse 方法的情况下将数组反转到位。我尝试了以下代码:
function reverseArray(arr) {
return arr.map(() => {
return arr.pop()
})
}
console.log(reverseArray([1, 2, 3, 4]));
//logs [4,3,undefined,undefined]
使用开发工具调试器,这是控制台中的日志:(4) [4, 3, empty × 2]
.
arr.pop()
如果在空数组上调用,则返回 undefined,但据我了解,在这种情况下它不应该为空。
问题:发生了什么?为什么前两个元素打印正确,而其余的则不正确?
解决方案
在迭代数组时,您正在从数组中删除元素。文档说:
map 处理的元素范围是在第一次调用回调之前设置的。...在调用 map 开始之后和被访问之前被删除的元素不会被访问。
所以map()
一开始就确定它会迭代 4 次,创建一个有 4 个元素的数组。
在第一次迭代中,arr.pop()
删除arr[3]
. 在第二次迭代中,它删除了arr[2]
.
第三次迭代预计处理arr[2]
. 但是由于该元素不再存在,它不会调用回调函数,而只是存储undefined
在结果数组中。同样的事情发生在第四次迭代。
您可以遍历数组的副本。
function reverseArray(arr) {
return [...arr].map(() => {
return arr.pop()
})
}
console.log(reverseArray([1, 2, 3, 4]));
推荐阅读
- c - 在 C 中运行 make 文件时的最新消息
- azure - Azure API - 如何确定 VM 是否正在运行或已解除分配
- php - 环境变量/.env 文件
- webpack - Laravel Mix/Webpack 目录前缀
- javascript - 如何获取 this.value 作为放置在 JavaScript 事件处理程序中的函数中的参数?
- opengl - 如何从 Gamemaker Studio 2 着色器中获取房间(或屏幕)坐标?
- node.js - 如何在nodejs中使用多线程或进程
- r - 创建具有 2 个分类列的所有组合的数据框,然后按每个组合对第 3 列求和
- android - 迁移到 androidx 后未显示 android XML 预览
- gatsby - Gatsby 插件站点地图不会为我的网站生成站点地图