• Hello,Tomrrow
    2022-09-21 来自北京
    JS 中的const 是否是可变,要分情况。 如果 const 声明的变量赋值给了原始类型,如数字、bool、字符串,此时就是不可变的; 如果 const 声明的变量赋值了复合类型,如数组、对象,此时变量指向的地址不可比变,但是复合类型的内容还是可以调整的, 如更改对象的属性值

    作者回复: 正解

    共 2 条评论
    29
  • null
    2022-09-19 来自北京
    单独这一篇就值回票价了,学到了很多东西😁

    作者回复: 很高兴你这么说,看来以后每篇都是赚的了😄

    
    11
  • Geek_dc85eb
    2022-09-20 来自北京
    开发中const一般是不变的

    作者回复: 这里的不可变我们要搞清楚是值不可变,还是变量的不可变。 比如我们给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)

    
    4
  • I keep my ideals...
    2022-09-20 来自北京
    我认为const对于值类型来说是不可变的,但是对应引用类型来说就不一定了(可以保证引用类型的存储地址不变,但是不能保证里面存储的内容不变)

    作者回复: 差不多是这个意思,或者也可以说对于“原始类型值”,如数字、字符串是不可变的。对于像数组这样的“对象类型值”,仍然是可变的。所以常量只是做到“赋值动作”的不可变,而不是做到“值”本身的不可变

    
    4
  • 依韵
    2022-10-13 来自北京
    > “纯函数”对值只影响一次,而“不可变”完全不影响。 针对这个还是有点疑问。 即然是从返回值的角度来看,那么能保持幂等的纯函数,返回一个新值,这个新值是基于输入创造的,可以当成是影响,就当是影响了一次。 那对不可变来说,如 `slice` 也返回了一个新值,这个新值是基于输入(原始数组)创造的,为什么要当成是完全不影响呢。 这点如何理解,还希望得到解答。 写完这个问题, 我意识到是不是说纯函数和不可变描述的是不同的角度,纯函数是从返回值的角度来看,不可变是从输入的角度来看,这样理解是否正确? 如果获取数组中某个子数组的函数,如果使用 `Array.prototype.slice` 来实现,那么是纯函数,也是不可变。换成 `Array.prototype.splice` 来实现就仅仅是纯函数,而不是不可变。 如 `conat add = (a,b) => a + b;` add 是纯函数,也是不可变。

    作者回复: 我们还是可以用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]

    
    2
  • weineel
    2022-10-09 来自北京
    副作用的概念有点刷新认知。 老师说的副作用,指函数不可控的外部环境。 我之前认为的副作用,是函数会对外部环境产生影响,比如改变全局变量的值。 还有一个疑问,如果函数只改变了全局变量的值,并没有使用它进行计算(相同的输入,会有相同的输出),这个函数还是纯函数吗? 按我之前的对副作用的理解,就会认为不是纯函数了。

    作者回复: 函数会对外部环境产生影响,比如改变全局变量的值也是副作用。 如果函数只改变了全局变量的值,这里主要造成的问题是不可变。 关于一个函数是不是纯函数主要是看同样的输入,输出是否相同。

    共 3 条评论
    2
  • 南城
    2022-09-20 来自北京
    试读白嫖!能免费看四章(催更帖)

    作者回复: 对,先看看再说,觉得好再买

    
    2
  • 海是蓝天的倒影
    2022-12-13 来自海南
    这是我见过函数式和面向对象讲得最透彻的,没有之一。 感谢老师

    作者回复: 谢谢支持~

    
    1
  • 雨中送陈萍萍
    2022-11-03 来自北京
    老师讲的确实不错!! 先回答问题, 对于const来说,我认为只在某种意义上说是不可变的,const创建一个值的引用(指向的内存地址),后续无法通过赋值的方式改变这个引用。如果const声明初始赋值是原始类型,后续无法改变初始值,但是如果初始赋值类型是引用类型(对象类型),后续可以改变初始对象,也就不符合不可变的原则。 其次,老师把FP比作工具,把OOP比作对象,然后工具是服务于对象,一下子就把两者链接上,两者从我脑海中孤立存在变成了统一有机的整体,加深了对两者的理解。另外,原型链的讲解和传统继承,基于原型链的继承的区别的讲解,都简单易懂,真真不错!

    作者回复: 正解!谢谢支持~

    
    1
  • 朱基
    2022-10-13 来自北京
    本讲属于Javascript编程语言的内功与心法,感谢石川老师以个人的修悟为我们道来,有幸。

    作者回复: 幸会,也感谢一路有你。

    
    1