在谈论通过map
循环使用for
时,我对“提供不变性”的含义有一个模糊的理解。因为在数组上调用Array.prototype.map
不会阻止您更改原始数组。假设我们有单线程异步程序。在这些情况下,map
是否提供了for
循环上的“不变性”好处?
我可以想象以下代码:
function A() {
const arr = [1, 2, 3, 4, 5]
const anotherArr = arr.map((e, i) => {
arr[i] = 'changed'
// here goes some asynchronous code
return e * 2
})
// now arr is ['changed', 'changed', 'changed', 'changed', 'changed']
// and anotherArr is [2, 3, 6, 8, 10]
}
function B() {
const arr = [1, 2, 3, 4, 5]
const anotherArr = []
for (let i = 0, len = arr.length; i < len; i++) {
anotherArr[i] = arr[i] * 2
arr[i] = 'changed'
// here goes some asynchronous code
}
// and again:
// now arr is ['changed', 'changed', 'changed', 'changed', 'changed']
// and anotherArr is [2, 3, 6, 8, 10]
}
我猜想可能是在函数B anotherArr
中是在填充之前手动创建的。因此,在for
循环完成之前,具有相同作用域的某些对象可以对其进行更改。所以我的问题是:“就安全性而言,在单线程异步环境中使用map
而非for
循环是否有好处?”
编辑
我重新回答我的问题:“ Array.prototype.map
是否起作用?
提供(因为它属于功能范式)”。
据我所知,javascript中的map
函数与不变性无关,
它是关于隐藏一些实现细节(如何构造结果数组)。
因此map
函数是一种声明式的处理方式。 for
循环势在必行
做事的方式(我猜这带来了更多的自由和更多的责任)。
答案 0 :(得分:-1)
映射,缩小,过滤,forEach等
在我看来,以上方法对FP(函数式编程)非常有用。
当然,您可以使用它们代替普通的for循环, 但是普通的for循环比它们快(https://hackernoon.com/javascript-performance-test-for-vs-for-each-vs-map-reduce-filter-find-32c1113f19d7)。
所以在我看来,如果您不关心性能,则使用map,reduce等方法会很优雅,并且代码会越来越少可读。