作者回复: 正解
作者回复: 很高兴你这么说,看来以后每篇都是赚的了😄
作者回复: 这里的不可变我们要搞清楚是值不可变,还是变量的不可变。 比如我们给num赋值数组,值还是可变。 const num = [3]; num[0] = 5; // 返回:5 反之,我们没法拷贝原数组,slice后再赋值给原来的变量 const sliceNums = [1,2,3,4,5]; sliceNums = sliceNums.slice(0,2); // 返回错误 所以const还是蛮多坑的,在Java中用的就是final,而不是const。 也是因为这些坑,在JS中,通常const更多用于原始类型的值,比如数理常量、字节顺序或版本号: const H0 = 74; // 哈勃常数 (km/s/Mpc) const PI = 3.141592; // 圆周率 const C = 299792.458; // 光速 (km/s)
作者回复: 差不多是这个意思,或者也可以说对于“原始类型值”,如数字、字符串是不可变的。对于像数组这样的“对象类型值”,仍然是可变的。所以常量只是做到“赋值动作”的不可变,而不是做到“值”本身的不可变
作者回复: 我们还是可以用slice和splice来举例子 这里每次输入0,3,slice只影响结果一次。而splice每次都影响。 var arr = [1, 2, 3, 4, 5]; /***纯函数***/ arr.slice(0, 3); // 返回 [1, 2, 3] arr.slice(0, 3); // 返回 [1, 2, 3] arr.slice(0, 3); // 返回 [1, 2, 3] /***非纯函数***/ arr.splice(0, 3); // 返回 [1, 2, 3] arr.splice(0, 3); // 返回 [4, 5] arr.splice(0, 3); // 返回 [] slice不可变是说它对原数组没影响,而splice会影响,所以是可变。 var arrA = [1, 2, 3, 4, 5]; /***不可变***/ var arrB = arrA.slice(0, 3); console.log(arrA); // 返回 [1, 2, 3, 4, 5] /***可变***/ var arrC = arrA.splice(0, 3); console.log(arrA); // 返回 [1, 2, 3]
作者回复: 函数会对外部环境产生影响,比如改变全局变量的值也是副作用。 如果函数只改变了全局变量的值,这里主要造成的问题是不可变。 关于一个函数是不是纯函数主要是看同样的输入,输出是否相同。
作者回复: 对,先看看再说,觉得好再买
作者回复: 谢谢支持~
作者回复: 正解!谢谢支持~
作者回复: 幸会,也感谢一路有你。