理解 JavaScript 中的类型
TypeScript 为 JavaScript 添加了丰富的类型系统。在开始使用这一丰富的类型系统之前,我们需要先了解 JavaScript 中有哪些类型。
JavaScript 中的原始类型
JavaScript 确实有一些基本的原始类型,但它们具体是哪些呢?
下面的 JavaScript 代码输出了四个具有不同值的变量的类型。我们可能期望输出结果为 string、number、boolean 和 date……但实际情况是这样吗?运行代码来看一下。
JavaScript
1const name = "Bob"; 2console.log("Type of name:", typeof name); 3 4const age = 30; 5console.log("Type of age:", typeof age); 6 7const cool = true; 8console.log("Type of cool:", typeof cool); 9 10const dateOfBirth = new Date(1989, 10, 5); 11console.log("Type of dateOfBirth:", typeof dateOfBirth);
几乎正确!JavaScript 确实有 string、number 和 boolean 类型,但并没有专门的 date 类型;相反,日期的类型是 object。
让我们再来看看 JavaScript 中其他可用的原始类型:bigint、null、undefined 和 symbol。运行以下代码:
JavaScript
1const count = BigInt(452947234234); 2console.log("count", typeof count); 3 4const address = null; 5console.log("address", typeof address) 6 7const phone = undefined; 8console.log("phone", typeof phone) 9 10const stars = Symbol('***'); 11console.log("stars", typeof stars)
你可能已经注意到,null 变量的类型是 object,而不是我们预期的 null。这是 JavaScript 中的一个 bug。
有关 JavaScript 类型的更多详细信息,请参考 MDN 文档。
JavaScript 是弱类型语言
在弱类型语言中,你不需要显式声明变量的类型。JavaScript 就是一种弱类型语言。
查看下面的代码:amount 变量最初是一个 number 类型,随后被赋值为一个 string。我们可能会希望在第 4 行收到错误或警告,但实际上会发生吗?
JavaScript
1let amount = 10; 2console.log("amount", typeof amount); 3 4amount = "Eight"; 5console.log("amount", typeof amount);
并不会。因为 JavaScript 是弱类型的,没有任何机制阻止变量改变其类型。
小结
本课的重点是:JavaScript 中只有少数几种有用的类型,并且无法声明变量的具体类型——变量的类型完全由其赋值的内容推断而来。此外,JavaScript 也没有严格的类型检查机制,这意味着变量可以随时被赋予任何类型的值。
缺乏丰富的类型系统和类型检查机制,正是 TypeScript 所要弥补的核心问题。在本课程中,我们将学习如何使用 TypeScript 的类型系统,从而提升开发 React 应用的效率。
下一节课中,我们将学习如何在 TypeScript 中声明带类型的变量。