Javascript 类似map()的函数,它不';不要创建新数组

Javascript 类似map()的函数,它不';不要创建新数组,javascript,Javascript,JS中是否有类似map()的函数将返回存储在原始数组中,而不是创建新数组?如果没有,最有效的方法是什么?只需使用: 完全相同的代码仍然适用于.map(它使用相同的三个参数调用回调,因此允许就地变异),但.forEach避免了创建新数组的开销,只会立即将其丢弃 还要注意的是,虽然可以在回调中引用myArray,但不引用则更有效。将array参数传递给回调函数后,回调函数就可以操纵或访问原始数组,而无需将其置于词法范围内(尽管使用此参数插入或删除元素是不明智的)您可以使用forEach。映射背后的思

JS中是否有类似map()的函数将返回存储在原始数组中,而不是创建新数组?如果没有,最有效的方法是什么?

只需使用:

完全相同的代码仍然适用于
.map
(它使用相同的三个参数调用回调,因此允许就地变异),但
.forEach
避免了创建新数组的开销,只会立即将其丢弃


还要注意的是,虽然可以在回调中引用
myArray
,但不引用则更有效。将
array
参数传递给回调函数后,回调函数就可以操纵或访问原始数组,而无需将其置于词法范围内(尽管使用此参数插入或删除元素是不明智的)

您可以使用
forEach
。映射背后的思想是,您可以修改数组中包含的数据,而无需修改原始数据。@RichardChristensen OP似乎知道这一点,如果您不需要,为什么还要创建一个新数组?@Redu不,不是-这已经创建了一个新数组,这使得持有对该数组的引用的任何其他元素现在持有对另一个数组的引用。@Redu修复了副作用问题,但仍然不必要地创建(然后丢弃)一个新数组。请阅读我的答案。很好的答案!我只想补充一点,使用参数中的数组变量更有效的原因是,许多JavaScript引擎通过省略函数定义的词法范围中的变量查找来优化不引用词法范围的函数。您甚至可以在浏览器调试器中通过在此函数内设置断点并尝试访问词法变量来确认这一点。会出错的,回答得好。我要做的唯一补充是,这种方法不仅允许改变数组中各个元素的值,还允许在迭代数组时从数组中添加或删除元素。我们应该谨慎地这样做,因为行为可能与您期望的不同(并且可能因实现而异)。@Smcrohan我认为规范保证在迭代开始之前只确定一次数组索引,但我绝不建议在这样的循环中实际更改数组大小。对。我肯定不打算支持这种做法……更像是“说出可能性,以便有机会提出警告”:
myArray.forEach(function(value, index, array) {
    array[index] = ...   // some mutation of value
});