第三章 JavaScript 的本质
目录
购买本书
(广告,请不要屏蔽。)

第三章 JavaScript 的本质

JavaScript 的本质可以概括如下:

它是动态的
很多东西都可以改变。例如,您可以在创建对象后自由地添加和删除属性(字段)。并且您可以直接创建对象,而无需先创建对象工厂(例如类)。
它是动态类型的
变量和对象属性始终可以保存任何类型的值。
它是函数式和面向对象的
JavaScript 支持两种编程语言范式:函数式编程(一等函数、闭包、通过 bind() 进行部分应用、数组的内置 map()reduce() 等)和面向对象编程(可变状态、对象、继承等)。
它会静默失败
直到 ECMAScript 3,JavaScript 才具有异常处理。这解释了为什么该语言经常静默失败并自动转换参数和操作数的值:它最初无法抛出异常。
它以源代码形式部署
JavaScript 始终以源代码形式部署,并由 JavaScript 引擎编译。源代码的优点是灵活的交付格式和抽象引擎之间的差异。使用两种技术来保持文件大小较小:压缩(主要是 gzip)和缩小(通过重命名变量、删除注释等方式使源代码更小;有关详细信息,请参阅第三十二章)。
它是 Web 平台的一部分
JavaScript 是Web 平台(HTML5 API、DOM 等)中不可或缺的一部分,以至于人们很容易忘记前者也可以在没有后者的前提下使用。然而,随着 JavaScript 在非浏览器环境(如 Node.js)中使用得越来越多,这一点变得越来越明显。

怪癖和非正统特性

一方面,JavaScript 具有一些怪癖和缺失的特性(例如,它没有块级作用域变量、没有内置模块,也不支持子类化)。因此,在其他语言中学习语言特性的地方,您需要学习 JavaScript 中的模式和解决方法。另一方面,JavaScript 包含了一些非正统的特性(例如原型继承和对象属性)。这些特性也必须学习,但它们更多的是一种特性,而不是缺陷。

请注意,JavaScript 引擎已经变得非常智能,并在底层修复了一些怪癖。例如

  • 从规范上讲,JavaScript 没有整数,只有浮点数。在内部,大多数引擎都尽可能地使用整数。
  • 可以说,JavaScript 中的数组过于灵活:它们不是元素的索引序列,而是从数字到元素的映射。这种映射可能会有漏洞:数组“内部”的索引没有关联值。同样,如果数组没有漏洞,引擎可以通过使用优化的表示形式来提供帮助。

优雅的部分

但 JavaScript 也有很多优雅的部分。Brendan Eich 最喜欢的是:[3]

  • 一等函数
  • 闭包
  • 原型
  • 对象字面量
  • 数组字面量

最后两项,对象字面量和数组字面量,允许您从对象开始,并在稍后引入抽象(例如构造函数,JavaScript 中类似于类的概念)。它们还支持 JSON(请参阅第二十二章)。

请注意,优雅的部分可以帮助您解决怪癖。例如,它们允许您在语言中实现块级作用域、模块和继承 API。

影响

JavaScript 受到了几种编程语言的影响(如图 3-1 所示)

  • Java 是 JavaScript 语法的榜样。它还导致 JavaScript 将值划分为基本类型和对象,以及 Date 构造函数(它是 java.util.Date 的移植)。
  • AWK 启发了 JavaScript 的函数。事实上,关键字 function 来自 AWK。
  • Scheme 是 JavaScript 具有头等函数(它们被视为值,可以作为参数传递给函数)和闭包的原因(请参阅第十六章)。
  • Self 导致了 JavaScript 不寻常的面向对象风格;它支持对象之间的原型继承。
  • Perl 和 Python 影响了 JavaScript 对字符串、数组和正则表达式的处理。
  • 除了实际的语言之外,HyperTalk 还影响了 JavaScript 如何集成到 Web 浏览器中。它导致 HTML 标签具有事件处理属性,例如 onclick


[3] Brendan Eich,“JavaScript 简史”,2010 年 7 月 21 日,http://bit.ly/1lKkI0M

下一页:4. JavaScript 的诞生