## 介绍

HTML是用来存储网页内容的，CSS是用来定义这些内容的显示样式的，而JavaScript是用来创造丰富的页面效果或者网页应用的。

但是，如果从浏览器的范畴去理解“JavaScript”这个术语，它包含了截然不同的两个方面。一个是JavaScript的核心语言（ECMAScript），另一个是DOM（文档对象模型）。

## JavaScript核心语言 (ECMAScript)

JavaScript的核心语言是ECMAScript。ECMAScript是由ECMA TC39委员会进行标准化的一门编程语言，其最新版本是ECMAScript 7.0。

核心语言同样可以被用在非浏览器环境中，例如 node.js。

### 哪些内容被纳入ECMAScript范畴中了？

ECMAScript 定义了：

- 语法（解析规则，关键字，流程控制，对象初始化等）
- 错误处理机制（throw， try/catch 以及用户自定义错误类型的能力）
- 类型（布尔值，数字，字符串，函数，对象等）
- 全局对象。在浏览器环境中，这个全局对象就是 window 对象，但是 ECMAScript 只定义与浏览器无关的 APIs（例如，parseInt， parseFloat， decodeURI， encodeURI 等）
- 基于原型的继承机制
- 内置对象和函数（JSON，Math，Array.prototype 方法，Object introspection 方法等）
- 严格模式

### 浏览器支持

截止2014年8月份，主流浏览器的最新版本都已经支持ECMAScript 5.1，但是旧版本的浏览器大都仅支持ECMAScript 3和ECMAScript 5的部分标准。这里是一些关于ECMAScript 5的浏览器支持情况的资料。如今，主流浏览器的最新版本已经支持 ECMAScript 6 的大部分标准。

### 未来

ECMA-262（ECMAScript 4 或者 ES4）第4版的提议本应成为自1999年第3版发布以来的一次重要更新，但是在2008年8月份，ECMAScript第4版被回退到一个代号为ECMAScript Harmony的项目，像`const`关键字以及对象代理等内容都被涵盖其中。你可以在这里跟踪这个项目的进展。ECMA 委员会已经在 2015年6月17号，正式发布了第6版标准。

## 国际化API

由Ecma TC39进行标准化的ECMAScript国际化API规范是在ECMAScript语言规范之上额外增加的。国际化API为JavaScript提供了规则排序（字符串比较），数字格式化，日期时间格式化等功能，能够让应用根据实际需要选择语言或功能。本标准在2012年12月份审批通过，可以在Intl对象页面查看浏览器的实现情况。

## DOM API

### WebIDL

WebIDL定义了ECMAScript和DOM技术之间的交互规范。

### DOM核心

文档对象模型（DOM）是用来表达HTML，XHTML及XML文档中的对象或与其进行交互的约定，它是跨平台的，并且与编程语言无关。通过调用DOM树上对象的方法可以操纵这些对象。文档对象模型核心是由W3C进行标准化的，它将HTML和XML文档抽象成对象，并在其上定义接口以及操纵这些对象的机制，这些定义都是与编程语言无关的。

- DOM核心中定义了文档结构，树模型，以及DOM事件架构，包括：Node， Element， DocumentFragment， Document， DOMImplementation， Event， EventTarget等。
- DOM事件中包括DOM事件架构不太严格的定义以及一些特殊事件。
- DOM 元素遍历 以及 DOM Range 对象等其它内容。

从ECMAScript的角度来看，DOM规范中定义的对象被称作“宿主对象”。

### HTML DOM

HTML是一种网页标记语言，它在DOM核心抽象概念之上，还定义了元素的含义，比如元素的`className`属性以及 `document.body`对象等。
HTML规范同时还约束了元素之间的关系，例如无序列表`ul`元素中，只能以`li`元素作为子元素来表达列表项。还有就是禁止使用标准中未定义的元素和属性。

想了解更多关于Document对象、Window对象以及其他DOM元素的信息？请访问Gecko DOM文档。

## 其他值得关注的API

- HTML标准中Window接口首次对setTimeout和setInterval函数进行定义。
- XMLHttpRequest. 用来发起异步HTTP请求的API。
- CSS 对象模型 用于将CSS规则抽象成对象。
- WebWorkers. 是用来并行计算的API。
- WebSockets. 是用来实现双向Socket通信的API。
- Canvas 2D Context. canvas元素的绘图API。

## 浏览器支持

相信每个Web开发人员都曾经有过“DOM就是一团糟”的体验，因为浏览器对DOM的支持千差万别。造成这种局面的主要原因是在DOM规范中对于很多重要的DOM特性并未清晰定义，另外，一些浏览器也增加了不兼容的特性（例如Intenet Explorer的事件模型）。自2011年6月以来，W3C，特别是WHATWG都在对旧特性进行细节定义，以提高互用性。浏览器也基于这些更加详细的规范提升它们的实现方式。

要实现跨浏览器的兼容性，一个常见的但可能不是最可靠的方式就是使用JavaScript库。这些库对于DOM特性进行抽象，以确保它们所提供的API在不同的浏览器上行为一致。被广泛采用的框架有 jQuery，prototype 和 YUI。