在具体介绍 JS 类型系统问题之前,先解释两组在区分不同编程语言时经常提及的名词:
- 强类型与弱类型(类型安全)
- 静态类型与动态类型(类型检查)
它们分别是从类型安全和类型检查这两个维度去区分了不同的编程语言,首先来看类型安全这样一个维度。从类型安全的角度来说,编程语言分为强类型和弱类型。强弱类型的概念最早是1974年的时候美国有两个计算机专家提出来的,当时对强类型这样一个概念定义就是,在语言层面就限制了函数的实参类型就必须与形参类型相同。而弱类型怎完全相反,它在语言层面不会限制实参的类型。由于这种强弱类型之分根本不是某一个权威机构的定义,而且当时这两位计算机专家也没有给出一个具体的规则,就导致了后人对这种界定方式的细节出现了一些不一样的理解。但是整体上大家的界定方式都是在描述强类型有更强的类型约束,而弱类型中几乎没有什么约束。强类型语言当中不允许任意的隐试类型转换,而在弱类型语言当中则允许任意的数据隐试类型转换。我们所说的强类型是指在语言的语法层面,就限制了不允许传入不同类型的值。如果传入了不同类型的值,在编译阶段会报出错误而不是等到运行阶段再通过逻辑判断去限制。在 JS 中所有报出的类型错误,都是在代码层面然后在运行时通过逻辑判断手动抛出的。变量类型允许随时改变的特点,不是强弱类型的差异。