JavaScript 进阶实战课
石川
JavaScript Patterns and Anti-Patterns 等开源项目创建者,O'Reilly 技术评审
15066 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 47 讲
开篇词 (1讲)
JavaScript 进阶实战课
15
15
1.0x
00:00/00:00
登录|注册

01 | 函数式vs.面向对象:响应未知和不确定

你好,我是石川。
编程模式(programming paradigm)可以说是编程语言的元认知。从编程模式的角度看 JavaScript,它是结构化的、事件驱动的动态语言,且支持声明式和指令式两种模式。所以我们说,JavaScript 是一个多模式(multi-paradigm)的语言,也是一门“丰富”的语言。
在 JavaScript 所支持的编程模式中,用得最多的是面向对象(OOP object oriented programming)和函数式(FP functional programming)两种,其中又以面向对象的普及率最高。现在介绍面向对象的书已经很多了,函数式因为受众相对小一些,支持的语言少一些,所以被提及的也相对比较少。
我猜你也许已经对这两种编程模式有所了解,甚至会比较熟悉,但我之所以还是要在第一节课去强调这个话题,是因为你在学习 JavaScript 时,可能会面对以下至少 1 个核心痛点
如果你已经学过传统的面向对象语言,那么在学 JavaScript 的时候,很可能对函数式的理解和运用不够深入;
反之,如果你一开始就学习 JavaScript,只是停留在开发一些简单应用上,可以说你对它的面向对象的理解和运用,也不会很深入。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

JavaScript是一门支持面向对象和函数式编程的多模式语言。本文从函数式编程角度出发,介绍了函数的基本概念和使用方法,以及处理副作用的重要性。纯函数和不可变性是函数式编程的核心思想,通过减少对外界不确定因素的依赖来处理副作用。另外,文章还探讨了面向对象编程中对象的意义、封装、重用和继承的重要性,以及组合优于继承的概念。 JavaScript中的类和对象的原型链关系与传统面向对象语言的类和对象的拷贝从属关系有所不同。在JavaScript中,对象和构建函数之间是原型链接关系,而不是基于类的复制拷贝和从属关系。文章通过示例说明了基于原型的继承和原型链的概念,强调了JavaScript中面向对象编程的特殊性和继承的授权性质。 总的来说,函数式编程强调处理副作用的重要性,而面向对象编程则强调对象的意义、封装、重用和继承的重要性,以及组合优于继承的概念。理解这些核心概念对于深入学习JavaScript编程模式、数据结构、算法和设计模式具有指导意义,为学习和应用JavaScript提供了扎实的理论基础。 文章提出了一个思考题,探讨JavaScript中的常量是否算作不可变,鼓励读者在留言区分享答案和交流学习心得。整体而言,本文通过深入讨论函数式编程和面向对象编程的核心概念,为读者提供了对JavaScript语言的深入理解和应用指导。 延伸阅读部分提供了进一步学习的资源,为读者提供了拓展知识的机会。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《JavaScript 进阶实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(27)

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

    作者回复: 正解

    2022-09-21归属地:北京
    2
    30
  • null
    单独这一篇就值回票价了,学到了很多东西😁

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

    2022-09-19归属地:北京
    11
  • Geek_dc85eb
    开发中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)

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

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

    2022-09-20归属地:北京
    4
  • 海是蓝天的倒影
    这是我见过函数式和面向对象讲得最透彻的,没有之一。 感谢老师

    作者回复: 谢谢支持~

    2022-12-13归属地:海南
    3
  • 依韵
    > “纯函数”对值只影响一次,而“不可变”完全不影响。 针对这个还是有点疑问。 即然是从返回值的角度来看,那么能保持幂等的纯函数,返回一个新值,这个新值是基于输入创造的,可以当成是影响,就当是影响了一次。 那对不可变来说,如 `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]

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

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

    2022-10-09归属地:北京
    3
    2
  • 南城
    试读白嫖!能免费看四章(催更帖)

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

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

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

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

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

    2022-10-13归属地:北京
    1
收起评论
显示
设置
留言
27
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部