[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。
- 本书简介
- 前言
- 关于这本书你需要知道些什么
- 如何阅读本书
- 目录
- I. JavaScript的快速入门
- 第1章 基础的JavaScript
- II. 背景知识
- 第2章 为什么选择JavaScript?
- 第3章 JavaScript的性质
- 第4章 JavaScript是如何创造出来的
- 第5章 标准化:ECMAScript
- 第6章 JavaScript的历史里程碑
- III. 深入JavaScript
- 第7章 JavaScript语法
- 第8章 值
- 第9章 运算符
- 第10章 布尔值
- 第11章 数字
- 第12章 字符串
- 第13章 语句
- 第14章 异常捕获
- 第15章 函数
- 第16章 变量:作用域、环境和闭包
- 第17章 对象和继承
- 第18章 数组
- 第19章 正则表达式
- 第20章 Date
- 第21章 Math
- 第22章 JSON
- 第23章 标准全局变量
- 第24章 编码和JavaScript
- 第25章 ECMAScript 5中的新功能
- IV. 技巧、工具和类库
- 第26章 元代码样式指南
- 第27章 调试的语言机制
- 第28章 子类化内置构造函数
- 第29章 JSDoc:生成API文档
- 第30章 类库
- 第31章 模块系统和包管理器
- 第32章 其他工具
- 第33章 接下来该做什么
- 著作权