💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] # 第3章JavaScript的本质 JavaScript的性质可以总结如下: **它是动态的** 许多事情可以改变。例如,您可以在创建对象后自由添加和删除对象的属性(字段)。您可以直接创建对象,而不必先创建对象工厂(例如,类)。 **它是动态类型的** 变量和对象属性可以始终保存任何类型的值。 **它的功能和面向对象** JavaScript支持两种编程语言范例:函数式编程(一等函数、闭包、 通过`bind()`、内置`map()`和`reduce()`等的部分应用程序数组等)和面向对象编程(可变状态,对象,继承等)。 **它默默地失败** 在 ECMAScript 3 之前,JavaScript 没有异常处理。这就解释了为什么语言经常会静默地自动转换参数和操作数的值:它最初不能抛出异常。 **它被部署为源代码** JavaScript 始终作为源代码部署,并由 JavaScript 引擎编译。源代码具有灵活的交付格式和抽象引擎之间的差异的好处。使用两种技术来保持文件大小:压缩(主要是gzip)和缩小(通过重命名变量,删除注释等,使源代码更小;详见第32章)。 **它是Web平台的一部分** JavaScript 是 Web 平台(HTML5 API,DOM等)的重要部分,很容易忘记,前者也可以在没有后者的情况下使用。然而,在非浏览器设置(如 Node.js)中使用的 JavaScript 越多,变得越明显。 ## 古怪和非官方特性 一方面,JavaScript有几个怪癖和缺少的功能(例如,它没有块范围的变量,没有内置的模块,并且不支持子类化)。因此,您在哪里学习其他语言的语言功能,您将学习 JavaScript 中的模式和解决方法。另一方面,JavaScript 包括非正统特征(如原型继承和对象属性)。这些也必须被学习,但是比 bug 更有特色。 请注意,JavaScript 引擎已经变得非常聪明,并修复了一些怪癖。例如: * 规范性地,JavaScript 没有整数,只有浮点数。在内部,大多数引擎尽可能地使用整数。 * 可以说,JavaScript 中的数组太灵活了:它们不是索引的元素序列,而是从数字到元素的映射。这样的地图可以有空格:数组中没有关联值的索引“inside”。再次,如果阵列没有孔,引擎可以帮助使用优化的表示。 ## 优雅部分 但JavaScript也有很多 优雅的部分。Brendan Eich的最爱是:[ 3 ] * First-class functions (一等函数) * Closures(闭包) * Prototypes(原型) * Object literals(对象字面量) * Array literals(数组字面量) 最后两个项目,对象文字和数组文字,让您从对象开始,然后介绍抽象(如构造函数,JavaScript的类似于类)。他们还启用JSON(参见[第22章](###))。 请注意,优雅的部分可以帮助您解决问题。例如,它们允许您实现块级作用域,模块和继承API - 所有这些语言。 ## 影响 JavaScript是受几种编程语言的影响(如下图所示): ![JavaScript的基于这些编程语言](https://box.kancloud.cn/7319c47853076980b3f91e340f886800_993x646.png) * Java 是 JavaScript 语法的角色模型。它还导致 JavaScript 将值分割为基元和对象以及 Date 构造函数(它是一个端口java.util.Date)。 * AWK 启发了JavaScript 的函数。其实关键字 function 来自 AWK。 * Scheme 是JavaScript具有一等函数的原因(它们被当作值对待,可以作为函数的参数传递)和闭包(参见[第16章](###))。 * Self 影响了JavaScript与众不同的面向对象的风格; 它支持对象之间的原型继承。 * Perl 和 Python 影响了 JavaScript 对字符串,数组和正则表达式的处理。 * 除了实际的语言之外,HyperTalk 还影响了JavaScript 是如何集成到web浏览器中的。它导致了具有事件处理属性的 HTML 标记,例如 onclick。 *** [ 3 ] Brendan Eich,“JavaScript简史”,2010年7月21日,http://bit.ly/1lKkI0M。