JS函数式编程数组赋值:使用Spread Operator还是直接赋值更优?
结论
方案1(使用展开运算符)更优,在该函数式编程场景下,必须使用数组拷贝逻辑(展开运算符是实现方式之一),方案2属于错误实现。
核心差异说明
JS中数组属于引用类型,两个方案的核心区别不在于单次返回值的输出结果,而在于是否修改了外部传入的原数组:
- 方案2的
let newArray = arr只是把原数组的引用赋值给了新变量,没有生成新的数组实例,后续调用push方法会直接修改原globalArray的内容。你可以在调用add方法后打印globalArray验证,方案2执行后全局数组已经被修改为[1, 2, 4, "red"],属于有严重副作用的实现,完全不符合函数式编程要求的纯函数、不修改外部状态的规范,多场景复用很容易产生难以排查的隐式bug。 - 方案1的展开运算符
[...arr]会生成一个和原数组内容一致的全新数组实例,后续修改完全不会影响原globalArray,属于无副作用的纯函数实现,符合函数式编程的要求。
可选替代方案
如果不想用展开运算符实现数组拷贝,也可以用以下方式实现相同效果:
- 使用
Array.from(arr) - 使用数组浅拷贝方法
arr.slice()
内容的提问来源于stack exchange,提问作者Egor Ulybin
相关产品推荐
相关产品推荐

