可转型参数类型的约定

从有类型声明的语言,比如C++/Java转到无类型声明语言时,最难理解的地方是参数类型。

比如javascript中,isNaN这个函数,有以下其怪的行为:

isNaN("abc")  // true

按类型语言的思维,这里应该先判断参数是否number类型,再做判断是否NaN的值。

事实上,isNaN先对参数做了包装,调用Number把参数包装成Number类型,再进行判断。

类型声明表达了一个强约定,参数必须满足约定才能完成功能,大多数强类型语言中需要通过多态达成通用型扩展。无类型声明语言这种对参数包装成期望类型的操作方式,以另一种方式达成了通用扩展。

isNaN({ valueOf: function() { return 0 }}) //false
isNaN({ valueOf: function() { return Number.NaN }}) //true

Javascript的通用性通过抽象操作来实现,所有对象通过调用通过valueOf()方法转型为基本对象,而Number和子类型对象返回自己的引用,实现操作一致性,且效率无损。

这就是在接口,鸭子类型之外的另一个参数类型约定。它可以简化为,实参只要可转化成形参类型。

在C++中可以通过实参定义一个类型转换函数,例如上面在C++中可能表达为:

class Number {
public:
  Number(int value);
  static const Number NaN;
  bool operator == (Number const& other);
};
class SomeObject {
  operator Number() const {
    return Number(0); //或者Number::NaN;
  }
};
bool isNaN(Number value) {
  return value == Number::NaN;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,275评论 0 4
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,225评论 19 139
  • 前言 人生苦多,快来 Kotlin ,快速学习Kotlin! 什么是Kotlin? Kotlin 是种静态类型编程...
    任半生嚣狂阅读 26,316评论 9 118
  • 荷花终究没能在我的房间盛开,师傅的枫叶染红了鸭脚。 软脚的鸭群被我抓紧鸭窝只能瞒过一个夜晚,白天大人就会发现,我能...
    岗背围阅读 119评论 0 1
  • 001 虽说坚持带来改变,但非常用劲去坚持一件事情,确实非常辛苦。我曾经也有过无数次的放弃或者拖延时间久、效率不高...
    青词读书看世界阅读 493评论 0 1