元类型系统是对JavaScript内建概念的补充

本文探讨了JavaScript的元类型系统,追溯了从远古JavaScript到现代JavaScript的类型系统演变,尤其是null和ECMAScript标准带来的挑战。文章指出,Metameta提供了对JavaScript类型系统的补充解释,强调JavaScript对象系统是以原子为基础的类型系统实现。
摘要由CSDN通过智能技术生成

本文是一个系列,包括:

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执行“构造一个对象”的职责,却没有人认得它是“类<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值