JS基础
JavaScript 简介
JavaScript 最初被创建的目的是“使网页更生动”。
这种编程语言写出来的程序被称为 脚本。它们可以被直接写在网页的 HTML 中,在页面加载的时候自动执行。
脚本被以纯文本的形式提供和执行。它们不需要特殊的准备或编译即可运行。
浏览器中的 JavaScript 不能做什么?
为了用户的(信息)安全,在浏览器中的 JavaScript 的能力是受限的。目的是防止恶意网页获取用户私人信息或损害用户数据。
此类限制的例子包括:
-
网页中的 JavaScript 不能读、写、复制和执行硬盘上的任意文件。它没有直接访问操作系统的功能。
现代浏览器允许 JavaScript 做一些文件相关的操作,但是这个操作是受到限制的。仅当用户做出特定的行为,JavaScript 才能操作这个文 件。例如,用户把文件“拖放”到浏览器中,或者通过
<input>
标签选择了文件。有很多与相机/麦克风和其它设备进行交互的方式,但是这些都需要获得用户的明确许可。
-
不同的标签页/窗口之间通常互不了解。有时候,也会有一些联系,例如一个标签页通过 JavaScript 打开的另外一个标签页。但即使在这种情况下,如果两个标签页打开的不是同一个网站(域名、协议或者端口任一不相同的网站),它们都不能相互通信。
这就是所谓的“同源策略”。为了解决“同源策略”问题,两个标签页必须 都 包含一些处理这个问题的特定的 JavaScript 代码,并均允许数据交换。本教程会讲到这部分相关的知识。
这个限制也是为了用户的信息安全。例如,用户打开的
http://anysite.com
网页必须不能访问http://gmail.com
(另外一个标签页打开的网页)也不能从那里窃取信息。 -
JavaScript 可以轻松地通过互联网与当前页面所在的服务器进行通信。但是从其他网站/域的服务器中接收数据的能力被削弱了。尽管可以,但是需要来自远程服务器的明确协议(在 HTTP header 中)。这也是为了用户的信息安全。
如果在浏览器环境外(例如在服务器上)使用 JavaScript,则不存在此类限制。现代浏览器还允许安装可能会要求扩展权限的插件/扩展。
JavaScript “上层”语言
不同的人想要不同的功能。JavaScript 的语法也不能满足所有人的需求。
这是正常的,因为每个人的项目和需求都不一样。
因此,最近出现了许多新语言,这些语言在浏览器中执行之前,都会被 编译(转化)成 JavaScript。
现代化的工具使得编译速度非常快且透明,实际上允许开发者使用另一种语言编写代码并会将其“自动转换”为 JavaScript。
此类语言的示例有:
- CoffeeScript 是 JavaScript 的一种语法糖。它引入了更加简短的语法,使我们可以编写更清晰简洁的代码。通常,Ruby 开发者喜欢它。
- TypeScript 专注于添加“严格的数据类型”以简化开发,以更好地支持复杂系统的开发。由微软开发。
- Flow 也添加了数据类型,但是以一种不同的方式。由 Facebook 开发。
- Dart 是一门独立的语言。它拥有自己的引擎,该引擎可以在非浏览器环境中运行(例如手机应用),它也可以被编译成 JavaScript。由 Google 开发。
- Brython 是一个 Python 到 JavaScript 的转译器,让我们可以在不使用 JavaScript 的情况下,以纯 Python 编写应用程序。
- Kotlin 是一个现代、简洁且安全的编程语言,编写出的应用程序可以在浏览器和 Node 环境中运行。
这样的语言还有很多。当然,即使我们在使用此类编译语言,我们也需要了解 JavaScript。因为了解 JavaScript 才能让我们真正明白我们在做什么。
总结
- JavaScript 最开始是专门为浏览器设计的一门语言,但是现在也被用于很多其他的环境。
- JavaScript 作为被应用最广泛的浏览器语言,且与 HTML/CSS 完全集成,具有独特的地位。
- 有很多其他的语言可以被“编译”成 JavaScript,这些语言还提供了更多的功能。建议最好了解一下这些语言,至少在掌握了 JavaScript 之后大致的了解一下。
手册与规范
这本书是一个 教程。它旨在帮助你由浅入深掌握 JavaScript 这门语言。但是,当你已经熟悉了这门语言的基础知识,你就会需要其他资料。
规范
ECMA-262 规范 包含了大部分深入的、详细的、规范化的关于 JavaScript 的信息。这份规范明确地定义了这门语言。
但正因其规范化,对于新手来说难以理解。所以,如果你需要关于这门语言细节最权威的信息来源,这份规范就很适合你(去阅读)。但它并不适合日常使用。
每年都会发布一个新版本的规范。最新的规范草案请见 https://tc39.es/ecma262/。
想了解最新最前沿的功能,包括“即将纳入规范的”(所谓的 “stage 3”),请看这里的提案 https://github.com/tc39/proposals。
当然,如果你正在做浏览器相关的开发工作,那么本教程的 第二部分 涵盖了其他规范。
手册
-
MDN(Mozilla)JavaScript 索引 是一个带有用例和其他信息的主要的手册。它是一个获取关于个别语言函数、方法等深入信息的很好的信息来源。
你可以在 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference 阅读它。
不过,利用互联网搜索通常是最好的选择。只需在查询时输入“MDN [关键字]”,例如 https://google.com/search?q=MDN+parseInt 搜索 parseInt
函数。
兼容性表
JavaScript 是一门还在发展中的语言,定期会添加一些新的功能。
要查看它们在基于浏览器的引擎及其他引擎中的支持情况,请看:
- https://caniuse.com —— 每个功能的支持表,例如,查看哪个引擎支持现代加密(cryptography)函数:https://caniuse.com/#feat=cryptography。
- https://kangax.github.io/compat-table —— 一份列有语言功能以及引擎是否支持这些功能的表格。
所有这些资源在实际开发中都有用武之地,因为它们包含了有关语言细节,以及它们被支持的程度等非常有价值的信息。
为了让你在真正需要深入了解特定功能的时候不会捉襟见肘,请记住它们(或者这一页)。
Hello, world!
本教程的这一部分内容是关于 JavaScript 语言本身的。
但是,我们需要一个工作环境来运行我们的脚本,由于本教程是在线的,所以浏览器是一个不错的选择。我们会尽可能少地使用浏览器特定的命令(比如 alert
),所以如果你打算专注于另一个环境(比如 Node.js),你就不必 多花时间来关心这些特定指令了。我们将在本教程的 下一部分 中专注于浏览器中的 JavaScript。
首先,让我们看看如何将脚本添加到网页上。对于服务器端环境(如 Node.js),你只需要使用诸如 "node my.js"
的命令行来执行它。
“script” 标签
可以使用 <script>
标签将 JavaScript 程序插入到 HTML 文档的任何位置。
<script>
标签中包裹了 JavaScript 代码,当浏览器遇到 <script>
标签,代码会自动运行。
现代的标记(markup)
<script>
标签有一些现在很少用到的特性(attribute),但是我们可以在老代码中找到它们:
type
特性:<script type=…>
在老的 HTML4 标准中,要求 script 标签有 type
特性。通常是 type="text/javascript"
。这样的特性声明现在已经不再需要。而且,现代 HTML 标准已经完全改变了此特性的含义。现在,它可以用于 JavaScript 模块。但这是一个高阶话题,我们将在本教程的另一部分中探讨 JavaScript 模块。
language
特性:<script language=…>
这个特性是为了显示脚本使用的语言。这个特性现在已经没有任何意义,因为语言默认就是 JavaScript。不再需要使用它了。