美文网首页
可转型参数类型的约定

可转型参数类型的约定

作者: ahuangliang | 来源:发表于2017-12-03 13:17 被阅读5次

从有类型声明的语言,比如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;
}

相关文章

  • 可转型参数类型的约定

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

  • 参数化类型

    向上转型是安全的,而向下转型是不安全的; 参数化类型就是一个编译器可以自动定制作用于特定类型上的类。 参数化类型会...

  • 11-27函数

    函数 函数的重点是识别调用约定、参数类型和返回值类型 调用约定: cdecl调用方平栈 stdcall被调用方平栈...

  • 函数类型与闭包

    函数类型 函数类型定义:(参数类型1,参数类型2,……)->返回值类型 函数类型是一种引用类型,类似于函数指针。可...

  • go 泛型

    go 泛型 1. 类型参数(Type parameters) Go语言的泛型(Generic)叫做类型参数。泛型可...

  • 2018-07-22 重载、重写(覆盖)、隐藏

    成员函数的重载,覆盖(多态)和隐藏 重载 函数名相同,函数的参数列表不同(包括参数个数和参数类型),至于返回类型可...

  • C#高级编程

    简介 过一下基础东西,学习一下不常用的特性 命名参数&可选参数 可空类型 ?? :合并运算符 ?:可空类型 构造函...

  • C# 泛型委托的 逆变与协变

    先说两个引子 1,类型的向上转型和向下转型 Animal类型 转为 Dog 类型为向下转型,反之。 2,泛型的转型...

  • php中的输出

    | 使用 | 所属 | 返回值 | 参数类型 | 参数数量 | 输出结果 | 结果可捕获| 备注 || -----...

  • tips of c#

    基础类型的大小是固定,因为会被映射成内部类型 可空值类型, 可空值类型不能赋值给普通的值类型 ref 参数 用来传...

网友评论

      本文标题:可转型参数类型的约定

      本文链接:https://www.haomeiwen.com/subject/jsuabxtx.html