发布于 2026-01-06 10 阅读
0

JavaScript 不是一种无类型语言

JavaScript 不是一种无类型语言

JavaScript 的流行度

截至本文撰写之时(2022年6月),JavaScript在PYPL指数中排名第三,仅次于 Java 和 Python。在最新的 Stack Overflow 开发者调查中,它连续第十年蝉联最常用语言。作为互联世界中 Web 应用编程的主要语言,无论经验水平如何,程序员都使用它进行学习和工作也就不足为奇了。

封面图片来自Pexels 的Fiona Art

但 JavaScript 是一种很特别的语言。它最初是为在 Web 浏览器上运行而设计的,但有些人却非常希望在浏览器之外使用它,甚至为此专门创建了 NodeJS。JavaScript 还催生了 AJAX 和 JSON 等技术(他们似乎很喜欢希腊神话),即使将来出现另一种脚本语言来取代它,这些技术仍然会被继续使用,而这种情况短期内不太可能发生。所以,人们对它的喜爱显而易见。

喜欢它吗?当你听人谈论或阅读相关内容时,你会很快发现人们对这门语言的看法非常强烈(或许这是开发者的通病)。他们要么爱它,要么恨它。很多人都有自己的看法,因为无论你身处哪个行业,每天都不可避免地要用到它。然而,除非你真正掌握了完善的最佳实践,否则它极易出错且不安全,以至于它至今仍是标准语言这件事本身就令人难以置信。

科技领域的影响者

最让我关注的是,很多初学者都如此热衷于 JavaScript。事实上,Python 也存在同样的现象。它们的高级特性和动态特性使得它们很容易上手。字典是基本类型,函数是一等公民……它们真的非常灵活!而且,写一些关于 JavaScript 的文章、制作 30 秒教程或者用三张幻灯片来解释它相比其他语言的优势,从而为你的文章、视频等吸引流量,也变得轻而易举。

有些科技博主甚至专门靠这类 JavaScript 内容来打造个人品牌。本文并非要探讨这些科技博主造成的总体危害,而是想具体分析一下我读到的一些观点,这些观点都存在一些非常具体的问题。

JavaScript 是一种无类型语言吗?

如果说新程序员最讨厌什么,那就是错误信息了。我想这就是为什么我看到有人把JavaScript的优势之一列为它优于其他语言的原因:JavaScript不会产生类型错误,因为它是一种无类型语言

这完全不对

是的,在相同情况下,JavaScript 比其他语言产生的错误更少。这算好事吗?如果"ba" + +"a" + "a" == "baNaNa"你对臭名昭著的错误视而不见……总之,这也不是本文的重点。我真正想表达的是:JavaScript 是一种类型语言

2015 年Stack Overflow 上曾就此话题展开过讨论(我相信这些年来许多其他网站也讨论过),其中最佳答案很好地总结了这个问题。关键在于你对“无类型”的定义。Brendan Eich 本人曾用这个术语来描述 JavaScript,意思是它不是静态类型的。然而,很多程序员忽略了一点:即使是他本人也指出,这个术语在学术界的用法有所不同,而且 JavaScript 实际上也存在类型化的值

对于专业人士来说,使用标准术语至关重要。无论你是否喜欢,“无类型”都不适合用来描述非静态类型语言。如果“无类型”已经有了其他含义:指没有类型的编程语言;而且你所说的内容也有明确的对应术语:“动态类型” ,那么应该优先选择清晰明确的术语。

让我们考虑以下几点:

  • 具有类型的编程语言就是类型语言。无论它是静态类型还是动态类型,它都是类型语言。
  • 类型会施加语义限制:因此会发生类型错误
  • JavaScript 可能会执行几乎所有可能的类型转换(这意味着它是弱类型语言)来避免此类错误,但仍然可能引发异常。例如:
    • null[0]
    • undefined[0]
    • null(1)
    • undefined(1)
    • 1(1)

所有这些操作都可以通过更多的类型转换来消除错误,例如将 ` nulla` 和 ` b` 转换undefined为空字典,或者将任何非函数值传递给始终返回类似 `null` 值的底层函数。但即使对于 JavaScript 来说,这也是一个糟糕的决定。因为类型错误并非为了惹恼你,而是为了帮助你。类型安全是一件好事。

结论

JavaScript 是一种有类型的语言,可能会引发类型错误,而且经常会发生大量的隐式类型转换,这只是该语言的一个特性,需要程序员格外注意。

请在评论区告诉我你的想法!


编辑

评论区已经有好几个人问过同样的问题了,所以我在这里写下答案,方便以后有人再问:

  • 你在哪里看到过 JavaScript 是无类型的?往上翻翻。正如我在文章里提到的,JavaScript 的创建者 Brendan Eich 用这个词来描述 JavaScript,在上面链接的 Stack Overflow 讨论中也有人这么说,一些我不想推荐的技术界意见领袖也这么说,最后还有一些用户在评论区也这么说。
  • 不存在无类型语言,这种说法毫无意义。如果按照无类型语言的定义——没有类型系统的语言(L. Cardelli 或 R. Harper 等作者使用的定义与动态类型或弱类型语言截然不同)——那么无类型语言是存在的。

    • 从图灵机本身到元胞自动机,许多图灵完备的形式语言都是无类型的。
    • 汇编语言是无类型的。有些汇编语言可能提供语法糖来处理类似原始类型值的操作,但大多数汇编语言并没有基于类型的类型系统来限制操作。
    • 有些 shell 语言是无类型的。它们类似类型的限制来自子进程,而不是来自原生类型系统。
    • 纯 Prolog 是无类型的。如果没有 IO 流实体,一切都是 Horn 子句,可以求值为真或假,没有类型限制。
    • 有些深奥的语言是无类型的。Brainf*ck 是最流行的,很多语言(通常是极简主义语言)都没有类型系统。

    我知道,除了汇编语言和 shell 语言之外,有类型语言在业界应用更为广泛,但这并不意味着区分它们毫无意义。别忘了,软件行业的发展远晚于计算机科学本身,而且两者至今仍在各自独立的领域中发展。

  • 类型系统并非如此运作。如果你阅读一下与@darkwiiplayer的评论,你会发现对于类型究竟是语法信息还是语义信息,似乎并没有达成共识。因此,根据你参考的资料不同,这一切可能有意义,也可能毫无意义。我正在调整的范式是:类型是语义信息,而非语法信息。这是一个复杂的话题,所以我就不赘述了,直接提供一些参考资料。

    • L. Cardelli & P.​​ Wegner (1985)论理解类型、数据抽象和多态性PDF
    • R. Harper (2016) 《编程语言实用基础》(第2版)(PDF
    • 类型检查是“语法”检查还是“语义”检查?计算机科学 Stack Exchange(链接

    为了公平起见,对于相反的观点,这里也提供他们的参考资料。

    • H. Geuvers (2019)类型论导论( PDF )

感谢所有参与评论的朋友们!


推荐阅读



让我们联系吧!文章来源:https://dev.to/miguelmj/javascript-is-not-an-untyped-language-1jkg