第6章 副作用和不变性
6.1 副作用
6.2 纯函数
6.2.1 外部变量
6.2.2 实现
6.2.3 函数内部的副作用
6.2.4 闭包
6.3 不变性
6.3.1 哲学上的不变性与身份
6.3.2 简单类型和复合类型
6.3.3 值类型和引用类型
6.3.4 可变类型和不可变类型
6.3.5 可变数据类型的坏处
在详细讨论完不变性的含义和其与其他概念的关系之后,终于可以来看看可变数据的坏处了。我们知道函数的副作用是有害的,编写函数时最容易犯的导致副作用的错误就是修改了数组和对象这样的可变类型的参数。
//求一个数字数组的算术平均数。
function mean(nums) {
return f.div(f.sum(nums), nums.length);
}
//求一个数字数组的平方平均数,也就是各个元素的平方的算术平均数的平方根。
function rms(nums) {
//为了利用求算术平均数的函数,先将数组的每个元素换成其平方值。
for (let i = 0; i < nums.length; i++) {
let n = nums[i];
nums[i] = f.mul(n, n);
}
let m = mean(nums);
return Math.sqrt(m);
}
let nums = [1, 2, 3, 4, 5];
f.log(mean(nums));
//=> 3
f.log(rms(nums));
//=> 3.3166247903554
上面代码中求算术平均数和平方平均数的函数看似都工作正常,但此时如果再求原数组的平均数&#