认识 JavaScript
这篇博文是关于《JavaScript高级程序设计(第3版)》(经典的红宝书)的读书笔记。
学习 JavaScript 我们多会听到另一个词 ECMAScript,它和 JavaScript 的关系是,ECMAScript 是“伪语言”,而 JavaScript 是对 ECMAScript 的一个实现。
几个特点
- 函数优先:由于编译器的作用,函数声明和变量声明都会被提升,但函数会首先被提升,然后才是变量。
- 轻量级解释型或即时编译型:即 JavaScript 不能被机器直接执行,需要解释或编译为机器语言。
- 可应用于浏览器或非浏览器环境,后者包括 Node.js、 Apache CouchDB 和 Adobe Acrobat。
- 基于原型编程:在原型编程中,类不是实时的,而且行为重用是通过复制已经存在的原型对象的过程实现的。
- 多范式:支持面向对象、命令式和函数式。
- 动态脚本语言:新的函数可以被引进,已有的函数可以被删除,类型在运行时检查。
知识点
接下来说说 JavaScript 的知识点,以下是从红宝书总结而来的:
- 在 HTML 中使用 JavaScript:当初开发 JavaScript 的时候,有一个重要问题就是如何做到让 JavaScript 既能与 HTML 页面共存,又不影响那些页面在其他浏览器中的呈现效果。最终的决定是为 Web 增加统一的脚本支持。
- 基本概念:任何语言的核心都必然会描述这门语言最基本的工作原理。而描述的内容通常都要涉及这门语言的语法、操作符、数据类型、内置功能等用于构建复杂解决方案的基本概念。
- 变量、作用域和内存问题:JavaScript 变量松散类型的本质,决定了它只是在特定时间用于保存特定值的一个名字而已。由于不存在定义某个变量必须要保存何种数据类型值的规则,变量的值及其数据类型可以在脚本的生命周期内改变。
- 引用类型:在 ECMAScript 中,引用类型是一种数据结构,用于将数据和功能组织在一起。它也常被称为类,但这种称呼并不妥当。尽管 ECMAScript 从技术上讲是一门面向对象的语言,但它不具备传统的面向对象语言所支持的类和接口等基本结构。引用类型有时候也被称为对象定义,因为它们描述的是一类对象所具有的属性和方法。
- 面向对象的程序设计:面向对象(Object-Oriented,OO)的语言有一个标志,那就是它们都有类的概念。ECMAScript 中没有类的概念,因此它的对象也与基于类的语言中的对象有所不同。我们可以把 ECMAScript 的对象想象成散列表:无非就是一组名值对,其中值可以是数据或函数。
- 函数表达式:函数表达式是 JavaScript 中的一个既强大又容易令人困惑的特性。定义函数的方式有两种:一种是函数声明,另一种就是函数表达式。
- BOM:ECMAScript 是 JavaScript 的核心,但如果要在 Web 中使用 JavaScript,那么 BOM(浏览器对象模型)则无疑才是真正的核心。BOM 提供了很多对象,用于访问浏览器的功能,这些功能与任何网页内容无关。
- 客户端检测:即使是那些跨平台的浏览器,虽然从技术上看版本相同,也照样存在不一致性问题。检测 Web 客户端的手段很多,而且各有利弊。但最重要的还是要知道,不到万不得已,就不要使用客户端检测。只要能找到更通用的方法,就应该优先采用更通用的方法。
- DOM:DOM(文档对象模型)是针对 HTML 和 XML 文档的一个 API(应用程序编程接口)。DOM 描绘了一个层次化的节点树,允许开发人员添加、移除和修改页面的某一部分。DOM 1 级主要定义的是 HTML 和 XML 文档的底层结构。
- DOM 扩展:对 DOM 的两个主要的扩展是 Selectors API(选择符API)和 HTML5。此外,还有一个不那么引人瞩目的 Element Traversal(元素遍历)规范,为 DOM 添加了一些属性。
- DOM 2 和 DOM 3:DOM 2 和 DOM 3 级比 DOM 1 级引入了更多的交互能力,也支持了更高级的XML特性,分为许多模块(模块之间具有某种关联),分别描述了DOM的某个非常具体的子集,包括 DOM 2 的核心、视图、事件、样式、遍历和范围、HTML 和 DOM 3 的 XPath 和加载与保存。
- 事件:JavaScript 与 HTML 之间的交互是通过事件实现的。事件,就是文档或浏览器窗口中发生的一些特定的交互瞬间。这种在传统软件工程中被称为观察员模式的模型。事件最早是作为分担服务器运算负载的一种手段。浏览器对象模型(BOM)也支持一些事件,这些事件与文档对象模型(DOM)事件之间的关系并不十分清晰,因为BOM事件长期没有规范可以遵循。
- 表单脚本:JavaScript 最初的一个应用,就是分担服务器处理表单的责任,打破处处依赖服务器的局面。尽管目前的 Web 和 JavaScript 已经有了长足的发展,但 Web 表单的变化并不明显。由于 Web 表单没有为许多常见任务提供现成的解决手段,很多开发人员不仅会在验证表单时使用 JavaScirpt,而且还增强了一些标准表单控件的默认行为。
- 使用 Canvas 绘图:这个元素负责在页面中设定一个区域,然后就可以通过 JavaScript 动态地在这个区域中绘制图形。与浏览器环境中的其他组件类似,canvas 由几组API构成,但并非所有浏览器都支持所有这些API。
- HTML 5 脚本编程:本书前面讨论过,HTML 5 规范定义了很多新 HTML 标记。为了配合这些标记的变化,HTML5 规范也用显著篇幅定义了很多 JavaScript API。定义这些 API 的用意就是简化此前实现起来困难重重的任务,最终简化创建动态 Web 界面的工作。
- 错误处理与调试:脚本出错时,浏览器通常会给出类似于 “object expected”(缺少对象)这样的消息,没有上下文信息,让人摸不着头脑。ECMAScript 第 3 版致力于解决这个问题,专门引入了 try-catch 和 throw 语句以及一些错误类型,意在让开发人员能够适当地处理错误。
- JavaScript 与 XML:曾几何时,XML 一度成为存储和通过因特网传输结构化数据的标准。DOM 规范的制定,不仅是为了方便在 Web 浏览器中使用 XML,也是为了在桌面及服务器应用程序中处理 XML 数据。此前,由于浏览器无法解析 XML 数据,很多开发人员都要动手编写自己的 XML 解析器。而自从DOM出现后,所有浏览器都内置了对 XML 的原生支持(XML DOM),同时也提供了一系列相关的技术支持。
- E4X(ECMAScript for XML):为处理 XML 定义了新的语法,也定义了特定于 XML 的对象。已废弃
- JSON(JavaScript Object Notation):曾经有一段时间,XML是互联网上传输结构化数据的事实标准。然而不少人认为 XML 过于烦琐、冗长。JSON 是在 JavaScript 中读写结构化数据的更好的方式。关于 JSON,最重要的是要理解它是一种数据格式,不是一种编程语言。JSON 并不从属于 JavaScript。不是只有 JavaScript 才使用 JSON,很多编程语言都有针对 JSON 的解析器和序列化器。
- Ajax(Asynchronous JavaScript and XML):这一技术能够向服务器请求额外的数据而无须卸载页面,会带来更好的用户体验。Ajax 技术的核心是 XMLHttpRequest (XHR)对象,XHR 为向服务器发送请求和解析服务器响应提供了流畅的接口。Ajax 通信与数据格式无关,从服务器取得的数据不一定是 XML 数据。
- 高级技巧:JavaScript 是一种极其灵活的语言,除了过程方式和面向对象方式,还有更为复杂和有趣的模式。包括高级函数、防篡改对象、高级定时器、自定义事件和拖放。
- 离线应用与客户端存储:所谓离线 Web 应用,就是在设备不能上网的情况下仍然可以运行的应用。开发离线 Web 应用需要几个步骤。首先是确保应用知道设备是否能上网,以便下一步执行正确的操作。然后,应用还必须能访问一定的资源(图像、JavaScript、CSS等),只有这样才能正常工作。最后,必须有一块本地空间用于保存数据,无论能否上网都不妨碍读写。
- 最佳实践:Web 开发从过去还都凑合的现象演化成了完整的研究规范。规范包括可维护性、性能和部署。
- 新兴的 API:包括 requestAnimationFrame、Page Visibility API、Geolocation API、File API、Web 计时、Web Workers。这些 API 没有包含在 HTML 5 中,但是属于 HTML 5 相关的 API。
学习笔记
另外博主还做了关于这本书的一些知识笔记,这些笔记是博主大概两年前阅读红宝书时整理的,基本都是思维导图,一直放在个人笔记里。现在将它们整理放到博客里,便于分享:
Leave a comment