《JavaScript函数式编程思想》——类型系统

第2章  类型系统

为什么在许多编程语言中整数和浮点数是两种类型?结构体、数组、列表、映射……这些类型有什么关系?用户自定义的各种类型与它们又有什么关系?函数也是类型吗?强类型和弱类型意味着什么?它们的区别和类型转换有关吗?静态类型语言中的变量为什么有固定类型而动态类型则没有?多态性就是后期绑定吗?鸭子类型是怎么回事?为什么要采用它?

假如您对以上问题感兴趣,阅读完本章时就会有肯定的答案。有了这些理论基础,理解JavaScript的类型系统就变得很轻松,并且能更清晰地掌握其特点。

2.1  类型是什么    
2.2  常用的数据类型    
2.2.1  整数    
2.2.2  浮点数    
2.2.3  布尔值    
2.2.4  字符    
2.2.5  元组、结构体、类    
2.2.6  函数    
2.2.7  数组、字符串、队列、堆栈、列表    
2.2.8  结构体、映射    
2.2.9  深入复合类型    
2.3  强类型与弱类型    
2.4  名义类型和结构类型    
2.5  静态类型与动态类型    
2.5.1  静态类型    
2.5.2  动态类型    

2.6  多态性

我们将对若干变量的一系列运算抽象成一个函数,这些变量就成为函数的参数。函数对参数有类型要求,只有符合此要求的值才能被传递给该函数。然而,一个函数名所代表的抽象运算未必是特定于该函数参数的类型的。换言之,有可能对不同类型的值有共同的抽象需求。例如,加法运算对整数和浮点数类型都适用,还可以扩展到字符串、集合等类型。对这些概念上相同的运算,在代码中用同一个名称来代表是可欲的。要实现这一点,有三种不同的做法。

第一种是1.1节中介绍的重载,也就是一个名称同时绑定多个参数类型或数目不同的函数。调用函数时,语言要在同名的多个函数中,根据实际参数的类型和数目找出形式参数与之匹配的那一个。这种做法要求函数的参数有类型标注,适用于静态类型的语言。

第二种是进行自动类型转换。具有某个名称的函数只有一个,调用函数时对于与其形式参数的类型要求不一致的实际参数,只要两者的类型是兼容的,就将实际参数转化成形式参数的类型。这种做法也要求函数的参数有类型标注,适用于静态类型的语言。

第三种就是本章中有几处提到的多态性(Polymorphism)。它指的是一个函数能够接受不同类型的参数,前提是这些类型有某种共性,而函数对参数的使用就囿于这种共性。

以加法运算为例。假如为整数和浮点数的加法各定义一个函数,但都使用+符号作名称,就是重载的做法。调用加法函数时,如果两个参数的类型都是整数,语言就选用整数加法的函数;如果两个参数的类型都是浮点数,则选用浮点数加法的函数。

假如只定义了一个参数为浮点类型的加法函数,就是采用类型转换的做法。无论两个参数的类型是整数还是浮点数,调用的都是同一个函数,只不过整数类型的参数会被先转换成浮点数。重载和类型转换可以结合使用。重载方案中,如果两个参数一个是整数一个是浮点数,语言就找不到与之匹配的加法函数,但仍可以选择浮点数的版本,只需将整数类型的参数转换成浮点数。

假如定义了一个加法函数,两个参数既能接受整数,也能接受浮点数,我们就说这个函数具有多态性。此处参数类型的共性是在其上都可以定义数学上的加法运算,该加法函数的实现就是以此数学运算为基础。

多态性是一个表象的概念,只要一个函数能处理不同类型的参数,就符合其标准。至于该函数是如何做到这一点的,有若干种方法,多态性本身并无规定。函数可以通过某种机制自身实现多态性,也

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值