JavaScript 指南 原书第7版 犀牛书JS高级程序设计京东自营
优惠价:¥119.1
本篇文章是JavaScript 函数式编程 学习系列第二篇,感兴趣也可以先去看第一篇:
前文 一文理解JavaScript中的函数式编程的概念 中写了函数式编程的概念,本篇文章继上文之后,来梳理 JavaScript 数据类型对函数式编程的影响。
函数式编程编程的核心就是 纯函数 和隔离 副作用 ,为了让 纯函数 保持纯粹,纯函数的参数或者内部引用的外部数据应该是不可变数据。但 JavaScript 中的数据类型并不是都是不可变的,而数据类型的可变性,很有可能让 纯函数 变的不纯。
因此,本篇文章的目的有两点:
- 探索 JavaScript 的数据类型来了解的可变数据的根源。
- JavaScript 的可变数据数据是怎么让 纯函数 变得不纯的?
- 如何解决 可变数据 的影响?
JavaScript中 的数据类型中的可变数据
在 JavaScript 中,数据类型有以下 8 种:
- null
- undefined
- boolean
- number
- symbol -- 在 es6 中被加入
- bigint -- es6+ 被加入
- object
注意点:
在 JavaScript 中,变量是没有类型的,值才有类型。变量可以在任何时候,持有任何值。
原始类型(基本类型)
上面 8 中类型除了 object ,其他都是原始类型,原始类型存储的都是值,其特点有两点:
- 没有方法可以直接调用
- 原始类型的数据是不可被改变的,改变一个变量的值,并不是把值改变了,而是让变量拥有新的值。
注意点:
- 1.toString()或者false.toString()等可以用的原因是被强制转换成了 String 类型也就是对象类型,所以可以调用 toString 函数。
- 对于null来说,很多人会认为它是个对象类型,其实是错误的。typeof null 会输出 object,这只是 JS 存在的一个悠久 Bug,而且好像永远不会也不会被修复,因为有太多已经存在的 web 的内容依存着这个 bug。注: 在 JS 的最初版本中使用的是 32 位系统,为了性能考虑使用低位存储变量的类型信息,000开头代表是对象,然而 null 表示为全零,所以将它错误的判断为 object 。虽然现在的内部类型判断代码已经改变了,但是对于这个 Bug 却是一直流传下来。
对象类型(引用类型)
而除了原始类型,剩下的 object 就是对象类型,和原始类型的不同点在于:原始类型存储的是值,对象类型存储的是地址。
经典示例: