尽管我不会将 JavaScript 称为 Lisp,但在我看来,它比大多数主流语言(甚至是函数式语言)更类似于 Lisp 的做事方式。
一方面,就像 Lisp 一样,它本质上是一种简单的命令式语言,基于适合由 REPL 驱动的无类型 lambda 演算。
其次,在 JavaScript 中嵌入文字数据(包括 lambda 表达式形式的代码)很容易,因为它的一个子集等同于 JSON。这是一种常见的 Lisp 模式。
第三,它的值和类型模型非常混乱。它在广义上是面向对象的,因为所有值都有一个标识的概念,但在大多数狭义上它并不是特别面向对象的。就像在 Lisp 中一样,对象是有类型的并且非常动态。代码通常被分成函数单元,而不是类。
事实上,在 JavaScript 世界中有几个(或多或少)最近的发展,让这门语言有时让人觉得很笨拙。以 jQuery 为例。在我看来,将 CSS 选择器作为子语言嵌入是一种非常类似于 Lisp 的方法。或者考虑一下 ECMAScript Harmony 的元对象协议:它看起来确实像 Common Lisp 的直接端口(比 Python 或 Ruby 的元对象系统都多!)。名单还在继续。
JavaScript 确实缺少宏和带有编辑器集成的 REPL 的合理实现,这是不幸的。当然,来自其他语言的影响也非常明显(不一定是坏的方式)。尽管如此,Lisp 和 JavaScript 阵营之间仍有大量的文化兼容性。有些可能是巧合(比如最近兴起的 JavaScript JIT 编译),有些是系统性的,但肯定是存在的。