本文是一个系列,包括:
- JavaScript的元系统 - https://blog.csdn.net/aimingoo/article/details/82014291
- JavaScript中创建原子的几种方法 - https://blog.csdn.net/aimingoo/article/details/82080105
- 元类型系统是对JavaScript内建概念的补充(本文)
JavaScript的类型系统一贯是反人类的,以至于JavaScript之父Eich都会跳出来说“我做错了”。但是这并不是说它的整个类型系统就是不可理解的,相反,它提供了观察这门语言的多个不同角度。
远古JavaScript中的类型系统
在远古时期(我是指JavaScript 1.0)中,JavaScript的世界里还并没有“原型”这个东西,而且undefined
也是一个奇葩的存在。
这时的undefined
是一个概念定义而非值声明,它表明函数或某个运算(例如属性存取)没有返回值。由于还没有===
和!==
运算符,所以undefined
被约定为与null
是等值的。
考察这个阶段,可以发现整个类型系统其实只有如下几种值类型。每种类型都包括一个它们各自表示(逻辑上的)“无值”的成员:
- 字符串值,空串是无值;
- 数字值,NaN是无值(数字值中的0表达非值);
- 布尔值,false是非值(或也可以理解为无值);
接下来就是对象和函数。它们都是引用类型(从最早的JavaScript语言就这样定义了),而且也各有一个表达“无值”的方式:
- 函数(以及表达式运算或值运算等)的结果:undefined
- 对象:null
这基本上就是JavaScript 1.0时代对类型系统的全部理解,以及假设。——之所以称之为假设,是因为这时连typeof
运算符都没有,所我们无法在语言的层面上验证它。
不过有趣的是,这个时代是支持面向对象编程的。JavaScript 1.0中的面向对象是“基于类”的,它有“类构造对象(的实例)”的概念:
obj = new Object;
// OR
function MyObject() {
this.x = 100;
}
obj = new MyObject;
在这时,Object
/MyObject
已经被称为构造器(constructor)了。它采用的是被称为“类抄写”的方式,通过向实例“this
”上添加成员来初始化对象。
这个时代并没有原型继承,也不支持instanceof
运算,因此尽管Object
/MyObject
执行“构造一个对象”的职责,却没有人认得它是“类<