书名:JavaScript全栈开发
ISBN:978-7-115-55366-9
本书由人民邮电出版社发行数字版。版权所有,侵权必究。
您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。
我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。
如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。
著 凌 杰
责任编辑 郭 媛
人民邮电出版社出版发行 北京市丰台区成寿寺路11号
邮编 100164 电子邮件 315@ptpress.com.cn
网址 http://www.ptpress.com.cn
读者服务热线:(010)81055410
反盗版热线:(010)81055315
这是一本JavaScript入门指南。它回答了如何单独使用JavaScript这门编程语言解决Web应用程序前后端开发过程中涉及的所有技术栈问题,帮助Web开发者减少其需要使用的编程语言种类,从而降低其学习成本。
本书将从ECMAScript标准定义的基本语法开始,系统阐述JavaScript在浏览器端、服务器端的开发思路和设计理念。在此过程中,作者将提供大量可读性强、能够正确运行的代码示例,以帮助读者理解书中介绍的技术、概念、编程思想与程序设计模式。本书主要由三部分组成:第一部分介绍JavaScript语言的核心知识点;第二部分介绍JavaScript在浏览器端的使用,包括BOM和DOM组件、AJAX技术等内容;第三部分介绍JavaScript在Node.js平台中的应用。
本书内容循序渐进,实操性强,适合对HTML和CSS有所了解的JavaScript初学者,以及对Web全栈开发及其背后的设计理念感兴趣的读者阅读。
大约两年以前,我在Facebook上看到一张名为“如何成为Web全栈开发者”的图,展示了一摞接近一米高的书,其中除了最基本的与HTML和CSS相关的书,还有若干本介绍浏览器端编程的JavaScript语言及其框架的书,若干本在服务器端使用的语言(例如Java、C#等)及其框架的书,最后再加上关于MySQL、SQLite3这类数据库以及Apache服务器的书,一共十几本,颇为“壮观”。当时我就在心里想:“这是在吓唬谁呢?”
在我个人看来,这些书中至少有一半与编程语言相关的问题可以用一本全面介绍JavaScript的书来解决,为了验证这一设想,我尝试着写了各位手中的这本书。
简而言之,本书是一本涵盖Web前后端全栈开发的JavaScript入门教程,从基于ECMAScript标准的基本语法开始,循序渐进、层层深入地介绍JavaScript在浏览器端、服务器端的开发思路、设计理念。在此过程中,本书提供大量可读性强、能够正确运行的代码示例,以帮助读者理解书中介绍的技术、概念、编程思想与程序设计理念。
除了前言部分,本书的主体由三部分组成。第一部分讨论的是JavaScript语言的核心,这里用4章的篇幅介绍JavaScript语言由ECMAScript标准所规范的基本语法、面向对象机制、异步编程方法等直接与语言本身相关的内容。第二部分讨论的是前端开发,这里用5章的篇幅来介绍JavaScript在浏览器端的使用,包括DOM和BOM组件、AJAX技术等。第三部分讨论的是后端开发,这里用4章的篇幅来介绍JavaScript在Node.js平台中的使用,包括如何创建Web服务器并响应浏览器的请求,如何读取服务器上的文件或在服务器上执行数据库操作等。下面是本书各章的内容简介。
第1章,JavaScript简介。这一章会让读者对JavaScript这门编程语言有一个整体的认知。首先详细介绍JavaScript的起源以及它的标准化过程,帮助读者了解它的组成和特性,以及能发挥其特性优势的领域。然后介绍如何搭建可用于执行/调试JavaScript脚本的运行环境。
第2章,变量、表达式与语句。这一章介绍注释、变量、表达式以及语句等JavaScript的基本语法元素及其用法。首先对如何在JavaScript代码中进行注释做一些相关的介绍和建议。然后介绍变量的定义、命名规范、数据类型、存储类型等基础知识,以及用于操作变量的操作符。最后讲解如何编写程序的最基本执行单位——语句,其中包括用于选择执行的条件语句和用于重复执行的循环语句。
第3章,函数与对象。这一章介绍封装的概念及其在编程中的意义。首先介绍如何将归属于不同任务的操作分离出来,封装成独立的函数并调用它。然后介绍如何将函数与其相关的数据进一步封装成对象。最后由对象的定义进一步引出数据结构的概念,帮助读者理解数据结构在编程中的作用。除此之外,本着“不要重复发明轮子”的基本编程原则,本章还将详细介绍一系列JavaScript中常用的内置函数和对象。
第4章,面向对象编程。这一章介绍如何在JavaScript中实现面向对象编程。首先从程序设计的需求面切入,解释什么是面向对象编程,以及将调用接口与具体实现分开设计的意义。然后详细介绍如何在构建对象的过程中将实现细节隐藏起来,并开放公有接口。接着进入面向对象编程的核心内容:类与类之间的继承关系。在针对该内容的讨论中,先详细介绍ES6新增的类定义与类继承语法,随即将时间拉回到ES6标准发布之前,为读者说明在没有类定义与继承语法的情况下,如何在JavaScript中实现面向对象编程。最后再回过头来证明ES6新增的语法并没有改变这一继承机制,它只是一个在使用上提供方便的“语法糖”。
第5章,异步编程。这一章介绍异步编程的概念及其用法与执行机制,其主要内容包括事件处理与Promise对象。本章会详细说明异步编程在JavaScript编程中的特殊地位,它是使用该语言编程最核心的技能之一。换句话说,只有掌握了异步编程,JavaScript在我们手中才能展现出其真正强大的能力。
第6章,前端编程概述。这一章介绍服务器和浏览器在Web应用程序架构中的分工,以便帮助读者明确前端编程的任务。作为本书第二部分的开篇,本章会介绍前端编程中具体要使用的对象,其中包含用于处理HTML和XML文档页面元素的DOM、用于处理浏览器部分功能的BOM、用于支持AJAX编程的XMLHTTP系列对象,以及用于装饰Web页面的CSS等美工技术。
第7章,DOM标准与使用。这一章介绍如何在前端处理XML与HTML文档的DOM对象。首先介绍DOM出现的历史背景以及标准化过程。然后详细介绍DOM的使用方式及其背后的编程思维。简而言之,DOM的本质是将浏览器所读取到的XML或HTML文档映射到内存中的一个树形的数据结构中,以便开发者通过对该树结构的节点进行增、删、改、查等操作的方式来实现Web应用程序用户界面的动态化。
第8章,DOM扩展与BOM。这一章介绍一系列具有专门用途的DOM扩展接口。通过使用这些接口,我们可以大幅度地降低开发、维护程序的成本,并提高程序的运行效率。本章还会介绍可用于在JavaScript脚本中执行浏览器相关操作的BOM接口。通过这些接口,我们可以在JavaScript脚本中完成页面的定位与导航、识别用户使用的浏览器、判断用户设备屏幕的大小、弹出系统对话框等任务。
第9章,前端事件处理。这一章详细介绍可用于响应用户界面操作的前端事件处理机制。首先对事件处理中所涉及的一些概念进行梳理,帮助读者了解何谓事件、如何触发事件、事件流是什么、如何响应事件等基础知识。然后从用户界面事件、鼠标操作事件、键盘操作事件以及焦点得失事件等几大类事件来介绍在Web应用程序的前端究竟可以处理哪些事件。除此之外,本章还会介绍事件在DOM事件流中的传播路径,它又分为事件捕获、处于目标与事件冒泡三个阶段,选择在哪一个阶段响应事件将在很大程度上决定事件处理函数的设计。
第10章,AJAX编程方法。这一章详细介绍AJAX编程方法。AJAX是一种让浏览器与服务器单独进行异步数据通信的方法,目的是让浏览器在不刷新当前页面的情况下与服务器进行数据交换,并根据交换的结果局部更新页面中的内容。首先介绍XMLHttpRequest
对象提供的常用接口,以及用该对象进行异步数据通信的基本操作。然后介绍如何将XMLHttpRequest
对象执行异步数据通信的基本操作后封装成常用的AJAX工具函数。除此之外,还会演示如何使用这些封装好的AJAX工具函数请求服务器端的数据。在此过程中,还会详细介绍JSON和XML这两种常用于网络传输的数据格式,演示如何在JavaScript代码中解析和序列化它们,并将请求到的数据在不刷新页面的情况下显示在页面中。
第11章,Node.js概述。这一章作为第三部分的开篇,会对Node.js这个可在浏览器之外运行JavaScript代码的运行环境进行概要性的介绍,为读者打好基础。
第12章,构建Web服务。这一章讨论如何在Node.js平台中构建Web服务。这是Node.js与PHP、JSP等Web应用开发方式的重大区别之一。使用PHP、JSP等应用开发方式通常需要借助Apache、Nginx、IIS这类服务器软件来构建Web服务,这无疑增加了Web全栈开发人员的学习成本和部署成本。当然,使用Node.js来构建Web服务也增加了编程的工作量。所以两种Web开发方式各有利弊,读者需根据自己的需要来取舍。
第13章,响应客户请求。这一章讨论如何编写基于Node.js的Web应用程序后端的核心任务:响应客户端请求。响应客户端请求的第一步是要对客户端发来的请求信息进行全面而细致的分析,这通常需要借助http.IncomingMessage
类的实例来完成。本章首先会详细介绍该类对象常用的属性和方法,以及可以注册的事件处理函数。响应客户端请求的第二步是根据分析的结果构建要返回给客户端的响应数据。响应数据主要可分为静态数据与动态数据两大类,可以根据客户端请求的URL来区分它们。另外,在构建响应数据的过程中,通常需要借助fs
模块中的方法将服务端的本地文件读取到程序中。若是静态资源就直接将读取出来的数据发送给客户端;若是动态资源,读取出来的数据必须进行一些处理才能发送给客户端,此时需要借助模板引擎构建响应数据。因此,本章也会对fs
模块中的常用方法和模板引擎进行介绍。响应客户端请求的最后一步是将响应数据发送给客户端,这通常要借助http.ServerResponse
类的实例来完成。本章会对该类对象常用的属性和方法,以及可以处理的事件进行详细介绍。
第14章,实现数据存取。这一章详细介绍如何在Web应用程序开发中解决数据持久化存取的问题。对于客户端,首先让人想到的是最传统的解决方案:Cookie。该方案虽然具有可自由配置数据有效时间、数据结构简单易用等优点,但也有大小非常有限、需要不断地在客户端与服务端来回传送、安全性不佳等缺点。为了解决Cookie方案存在的问题,HTML5提供了新的解决方案,即使用localStorage
与sessionStorage
这两个对象在客户端持久化存取不需要在客户端与服务端之间来回传送的数据。而对于服务端,数据存取操作通常需要借助数据库这种专用系统提供的解决方案来完成。本章会对这些解决方案进行逐一介绍。
由于这是一本专注于JavaScript本身及其运行环境的书,而JavaScript语言主要是一门面向Web应用程序开发领域的编程语言,即使是用于开发桌面应用程序的Electron框架,它在本质上也可以被视为一个针对Google Chromium浏览器(Chrome浏览器的开源版本)的扩展,它的用户界面布局也主要依靠HTML、CSS及其扩展技术来完成。所以在阅读本书之前,希望读者已经掌握了与HTML和CSS相关的基础知识。
同样,由于本书只专注于讨论如何使用JavaScript语言与其运行环境提供的接口,因此不打算过多地涉及时下五花八门的开发框架。这样做主要是基于两个方面的考虑。第一,介绍JavaScript语言及其运行环境本身就足以撑起一本结构完整、内容丰富的书了。如果再加上众多开发框架的介绍,就会淡化这本书的主题,并使其臃肿不堪。第二,JavaScript社区的开发框架不仅五花八门,选择众多,而且更新换代极为迅速。这意味着,即使这本书介绍了客户端的React框架、服务端的Express框架、桌面端的Electron框架,也很有可能到这本书写完并最终出版之时,开发者已经有了更好的选择。正所谓“授之以鱼不如授之以渔”,读者真正应该掌握的是快速学习新框架的能力,这就需要读者了解这些框架的设计思路,理解为什么决定开放那些接口给用户,以及为什么要对用户隐藏那些实现,从而习得开发框架的能力。换句话说,虽然不必重复发明轮子,但一个优秀的工程师或设计师应该了解轮子是如何被发明的,这样才能清楚用什么样的轮子构建什么样的车。
另外,要想学好一门语言,无论是英语、汉语这样的自然语言还是C/C++、Java、JavaScript这样的编程语言,最好的办法就是尽可能地在实践中使用它,在实际需求的驱动下模仿、试错并总结经验。所以本书不鼓励读者使用可直接复制和粘贴的代码示例,我更希望读者“自己动手”去模仿本书提供的示例,亲手将自己想要执行的代码输入计算机中,并观察它们是如何工作的,然后试着修改它们,并验证其结果是否符合预期。如果符合预期;就总结当下的经验;如果不符合预期,则去思考应该做哪些调整使其符合预期。如此周而复始,才能让学习事半功倍。
本书能够出版,离不开很多人的鼓励和帮助,我在这里需要感谢很多人。如果没有人民邮电出版社的陈冀康分社社长及曹修山、郭媛两位编辑的鼓励和鞭策,我是完成不了本书的。另外,感谢我的好朋友朱磊和陆禹淳分别对本书的初稿进行认真的审阅,并提供了不少宝贵的建议。还有,我的父母与女友蔓儿,感谢他们对我的照顾和给我温暖的爱,这是我在这个世界上奋斗的动力。最后感谢人民邮电出版社愿意出版这本题材也许没有那么热门的书,希望不会辜负他们信任。
当然,无论如何本书都会存在一些不够周全或者表达不清的地方。如果读者有任何意见,欢迎发邮件至lingjiexyz@hotmail.com,或者在异步社区本书的勘误页面中提出,以帮助我在本书的后续修订中进一步完善它。
2020年7月
谨将此书献给我在天上的外公
本书由异步社区出品,社区(https://www.epubit.com/)为您提供相关资源和后续服务。
本书提供如下资源:
本书源代码;
本书彩图文件。
要获得以上配套资源,请在异步社区本书页面中点击,跳转到下载界面,按提示进行操作即可。
作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。
当您发现错误时,请登录异步社区,按书名搜索,进入本书页面,点击“提交勘误”,输入勘误信息,点击“提交”按钮即可(见下图)。本书的作者和编辑会对您提交的勘误进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。
我们的联系邮箱是contact@epubit.com.cn。
如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。
如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们;有意出版图书的作者也可以到异步社区在线提交投稿(直接访问www.epubit.com/selfpublish/submission即可)。
如果您所在的学校、培训机构或企业,想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。
如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接发邮件给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。
“异步社区”是人民邮电出版社旗下IT专业图书社区,致力于出版精品IT技术图书和相关学习产品,为作译者提供优质出版服务。异步社区创办于2015年8月,提供大量精品IT技术图书和电子书,以及高品质技术文章和视频课程。更多详情请访问异步社区官网https://www.epubit.com。
“异步图书”是由异步社区编辑团队策划出版的精品IT专业图书的品牌,依托于人民邮电出版社近30年的计算机图书出版积累和专业编辑团队,相关图书在封面上印有异步图书的LOGO。异步图书的出版领域包括软件开发、大数据、AI、测试、前端、网络技术等。
异步社区
微信服务号
在如今种类众多的编程语言中,JavaScript是一个非常特殊的存在。如果从语言设计的角度来分析,JavaScript应该被归类为基于原型的、解释型的高级编程语言。也就是说,尽管JavaScript在语法上与Java、C/C++非常相似,但从编程方法的应用上来说,它受Self和Scheme这类语言的影响多一些,因此在具体使用方式上更接近后者。除此之外,JavaScript还是一门支持多种编程范式的语言。它支持面向对象编程、指令式编程以及函数式编程,因而具有极为灵活的表达能力。
而在适用领域方面,JavaScript从最初的纯浏览器端脚本语言,逐步发展成了如今这样一门可在Web浏览器端、移动设备端、桌面应用端以及服务器端通用的强大编程语言。由于这门语言在使用上的深度和广度,以及其在语法、设计理念上的复杂度,因此在具体学习该语言之前,需要先系统地了解一下它的概况。
在阅读完本章内容之后,希望读者能了解:
如果仔细观察一下如今在世界范围内广受欢迎的那些Web应用程序,例如Twitter、Facebook、YouTube、哔哩哔哩、新浪微博、淘宝等,就会发现它们能获得如此大的成功主要是因为它们首先在Web浏览器端实现了与桌面应用相似的人机交互体验,然后在移动端也实现了同样良好的用户体验。但众所周知的是,在过去相当长的一段时间里,Web站点都只是一组依靠超链接简单串联在一起的HTML文档。这些文档既无数据处理能力,也无法响应用户的操作,简单到甚至都不能被称为程序,更像一本被放在互联网上供人浏览的书。然而,随着Web站点的业务需求与日俱增(例如电子商务、线上交友、视频分享等),开发者越来越希望自己所创建的Web站点具有更强大的数据交互功能,并能即时响应用户的操作。于是,JavaScript应运而生。
当然,罗马不是一天建成的,JavaScript这门语言也不是生来就如此强大的,甚至它最初的设计目标只是想在Web浏览器中运行一些嵌入式脚本而已。JavaScript的历史开始于1995年,当时世界上非常成功的Web浏览器提供商——网景公司聘请了一个名叫布兰登·艾奇(Brendan Eich)的人,希望他研发一门能与Java语言搭配使用、语法也与其相似的浏览器端脚本语言。他没有辜负网景公司的重托,本着速战速决的态度,仅用了10天就完成了该语言的原型设计,并在Netscape Navigator 2.0的Beta版中发布了它,当时这门语言的名称还是LiveScript。同年12月,网景公司在Netscape Navigator 2.0 Beta 3版发布时又将它重新命名为JavaScript,相传这样做主要是想让这门新生的编程语言蹭一下Java的热度。他们当时可能也没有想到,这个名字反而在日后成了大众对该语言的诸多误解之一。事实上,Java和JavaScript之间并没有任何从属关系。
之后的事情大家都耳熟能详了。网景公司凭借着JavaScript在Web浏览器市场上大获成功,这最终引起了微软公司的注意。为了与之竞争,微软公司随后在Internet Explorer 3.0浏览器上提供了自家的JavaScript实现,即JScript。如果这能带来良性竞争倒也不失为一件好事,但让人非常遗憾的是,当时微软公司在自己的版本中加入了很多IE(Internet Explorer)浏览器的专属特性。这些举措让不少基于IE浏览器设计的Web页面无法在非IE浏览器中正常显示,结果就导致了它与网景公司之间的恶性竞争,最终引燃了一场非常惨烈且影响深远的浏览器大战(时间大约是从1996年到2001年)。站在今天回顾那段历史,我们会发现那场大战不只开启了开源运动的时代,也让JavaScript这门语言的标准化问题被提上了议程。
1996年11月,为了反制微软公司的恶性竞争,同时也为了使JavaScript语言的实现趋于标准化,网景公司正式向ECMA(European Computer Manufacturers Association,欧洲计算机制造商协会)提交语言标准。然后在次年的6月,ECMA就以当下的JavaScript语言实现为基础制定了ECMA-262标准规范。自此,JavaScript核心部分的实现也被称为ECMAScript。截至2019年5月,ECMA一共更新了9个版本的标准规范,如表1-1所示。
表1-1 ECMAScript的标准化历史
版本 |
发表日期 |
相关说明 |
---|---|---|
1.0 |
1997年6月 |
随着1.0 版标准规范的发布,JavaScript 语言进入标准化的时代 |
2.0 |
1998年6月 |
这一版修正了语言的编程格式,使其形式与 ISO/IEC16262 国际标准一致 |
3.0 |
1999年 12月 |
这一版增加了新的控制指令、异常处理功能以及功能强大的正则表达式,优化了词法作用域链、错误定义,以及数据输出格式等特性 |
4.0 |
2008年7月(放弃) |
由于草案的目标过于激进,相关各方对标准的方案出现了严重分歧,争论过于激烈,因此ECMA 最终决定放弃发布4.0版的标准规范 |
5.0 |
2009年12月 |
这一版新增了“严格模式(strict mode)”,提供更彻底的错误检查,以避免结构出错。澄清了许多3.0 版标准中的模糊之处,并适应了与规范不一致的真实世界实现的行为。除此之外,这一版的ECMAScript还增加了部分新的功能,例如getters及setters,支持JSON的解析和序列化等 |
5.1 |
2011年6月 |
ECMAScript的5.1版所做的修改主要是为了与国际标准 ISO/IEC 16262—2011保持一致 |
6.0 |
2015年6月 |
ECMAScript 2015(ES2015),这一版最早被称为ECMAScript 6(ES6)。这一版的 ECMAScript 新增了类和模块的语法,以及包括迭代器、Python 风格的生成器和生成器表达式、箭头函数、二进制数据、静态类型数组、集合(maps、sets和weak maps)、promise、reflection和 proxies 在内的其他特性 |
7.0 |
2016年6月 |
即ECMAScript 2016(ES2016),这一版小幅度地新增了一些新的语言特性 |
8.0 |
2017年6月 |
即ECMAScript 2017(ES2017),这一版小幅度地新增了一些新的语言特性 |
9.0 |
2018年6月 |
即ECMAScript 2018(ES2018),这一版新增了异步循环、生成器、新的正则表达式特性和 rest/spread 语法 |
与所有编程语言的标准化工作一样,标准规范与实际生产过程中的实现或多或少还是会存在一些偏差。目前市场上所使用的ECMAScript基本以ES5、ES6为主。下面来了解一下目前主流的JavaScript脚本引擎对不同版本标准规范的兼容性,如表1-2所示。
表1-2 各主流JavaScript脚本引擎对ECMAScript的支持情况
脚本引擎 |
代表性浏览器 |
ES5 |
ES6 |
ES7 |
ES7之后 |
---|---|---|---|---|---|
Chakra |
Microsoft Edge 18 |
100% |
96% |
100% |
58% |
SpiderMonkey |
Firefox 63 |
100% |
98% |
100% |
78% |
Chrome V8 |
Google Chrome 70 |
100% |
98% |
100% |
100% |
JavaScriptCore(Nitro) |
Safari 12 |
99% |
99% |
100% |
90% |
正是基于这样的现实,本书的内容主要以ES5或ES6为标准来展开。这样做既有助于读者理解JavaScript发展至今所形成的设计理念与编程思想,也有助于这门语言的初学者快速上手并实验本书中所呈现的示例,而不必因为相关运行环境对标准的兼容性而发愁。
如前所述,JavaScript最初只是一门依附于Web浏览器的脚本语言,正是由于Node.js运行环境的出现,它才发展成了如今这样一门横跨Web开发领域的前后端、移动设备端以及桌面应用端的全能型编程语言。所以,在讨论JavaScript这门语言的时候,读者必须要了解该语言除了被ECMAScript标准所定义的核心部分,还有其所在的具体运行环境。
例如,当我们讨论基于Web浏览器的JavaScript的时候,就应该知道这时候的讨论内容除了ECMAScript标准所规定的语法和基本对象,通常还会涉及用于处理Web页面内容的文档对象模型(Document Object Model,DOM)和用于处理Web浏览器事务的浏览器对象模型(Brower Object Model,BOM)。但在Node.js运行环境中,DOM和BOM就不存在了,这时候就要专注于Node.js所提供的核心模块,以及各种特定用途的第三方模块了。
总而言之,JavaScript这个术语所代表的不仅是ECMAScript标准所规范的一门脚本语言,还涉及这门语言所在的运行环境。在之后学习JavaScript的过程中,我们会越来越意识到这一点的重要性。这种意识将有助于理解JavaScript在Web应用的前后端开发中扮演的不同角色,而不至于产生混淆。
当然,这里所说的“全能型编程语言”仅仅指JavaScript适用的领域很广泛,并不是说可以用这门语言来解决所有的编程问题。JavaScript自诞生以来一以贯之的设计理念让它具备了一些与众不同的特性,这些特性基本上决定了它的编程思想以及专长的领域。下面是JavaScript的特性介绍。
x
的变量,那么x
的初始值可以为数字,然后在执行过程中被重新赋值为字符串,JavaScript的运行环境会负责自动识别该变量中存储了什么类型的数据。if-else
、switch
条件语句,while
、for
循环语句等),但在内在的设计上,它更接近Self和Scheme这一类语言。也就是说,它既支持面向对象编程,也支持指令式编程和函数式编程,因而具有极为灵活的表达能力。如前所述,如果想判断一门编程语言是否适用于某个领域,很大程度上要去分析该领域是否能发挥出该语言的特性优势。既然我们已经对JavaScript的语言特性有了一定的了解,那么接下来就可以对这门语言的适用领域做一些分析了。这些分析将有助于初学者明确JavaScript适合用来解决什么问题,不适合用来解决什么问题,以便厘清自己的学习需求和努力方向。以下是一些适合用JavaScript来解决问题的领域。
除此之外,JavaScript有时候还会被用来实现一些Web浏览器的扩展与插件、移动端的一些应用,甚至一些用于系统管理的命令行脚本。总而言之,虽然目前JavaScript已经发展成了一门无处不在的全能型编程语言,但还是得注意语言特性的发挥,能发挥出其特性优势的领域才是它真正适用的领域。反之,不分场合地强行使用这门语言只会弄巧成拙、事倍功半。
“工欲善其事,必先利其器。”在进入具体的学习任务之前,我们需要先将JavaScript的运行环境搭建起来。众所周知,JavaScript的运行环境主要分为Web浏览器环境和Node.js运行环境两种。如果不考虑Web浏览器特有的BOM和DOM组件,只是单纯学习ECMAScript,那么Node.js应该被优先考虑。因为它可以让我们像使用Shell、Ruby或Python脚本语言一样直接在命令行终端中执行JavaScript指令和脚本文件,在某种程度上更便于我们在初期的学习过程中随时查看代码的执行结果。
接下来,就让我们一起来安装Node.js运行环境吧。它主要有两种安装方式:通常在Windows操作系统和macOS中下载.msi和.dmg格式的安装包,然后使用安装包的图形化向导来进行安装,而在Linux和FreeBSD这一类操作系统中,则往往会使用apt和yum这样的包管理器来安装。这两种方式都不复杂,下面分别以Windows和Ubuntu操作系统为例,简单介绍一下这两种安装方式。
在Windows操作系统中想要安装Node.js,首先要选择一个合适的版本。打开Node.js的官网,可以看到有LTS和Current两种版本可供下载,如图1-1所示。LTS版即得到长期支持的版本,其组件通常都经过了充分的测试,比较稳定,适合用于正式的生产开发。而Current版本则是最新的版本,通常包含了最新加入的特性,比较适合想对Node.js本身进行研究的朋友。
图1-1 选择版本
下载完.msi格式的安装包之后,打开安装包启动它的图形化安装向导。在安装的开始阶段,需要设置一些选项,大多数时候只需采用默认选项,直接单击“Next”按钮即可。只是在组件选择的窗口中(如图1-2所示)需要注意一下,如果你对Node.js的组件并不熟悉,最好选择安装全部组件。另外,请记得点开图1-2中“Add to PATH”选项前面的“+”号,这样安装程序就会主动把Node.js和npm这两个模块的命令路径添加到系统环境变量里,这对初学者来说是非常方便的。
图1-2 选择安装组件
待一切选项设置完成之后,单击下面的“Install”按钮即可完成安装,如图1-3所示。
图1-3 完成安装
如果一切顺利,在Windows操作系统中打开cmd
终端,在其中输入node-v
命令并按“Enter”键后,就会看到相关的版本信息,如图1-4所示。
图1-4 在Windows中检查版本
对于Ubuntu这类Linux操作系统,安装软件往往都会选择使用apt这一类的包管理器,简单而方便,依次执行以下命令即可:
sudo apt update
sudo apt install nodejs
# 最新的 Node.js 已经集成了npm,所以某些情况下是无须单独安装npm的
sudo apt install npm
除此之外,安装n管理器也能管理Node.js的版本,其安装命令如下:
sudo npm install -g n
该工具的具体使用方式如下:
sudo n lts # 长期支持
sudo n stable # 稳定版
sudo n latest # 最新版
sudo n 12.4.0 # 直接指定版本
sudo n # 使用上下键切换已有版本
同样地,如果一切顺利,打开cmd
终端,并在其中输入node -v
命令并按“Enter”键后,就会看到图1-5所示的版本信息。
关于在Node.js中如何具体执行/调试JavaScript脚本,第2章介绍ECMAScript标准语法时会做具体演示,这里只需知道如何搭建并启动这个运行环境。
图1-5 在Linux中检查版本
目前,大部分开发者都会将Google Chrome或Mozilla Firefox设为自己的默认Web浏览器,因为它们本身都自带了一款非常不错的JavaScript运行环境。其中的Google Chrome浏览器,我们只需下载并安装它,然后在其主菜单中依次单击“更多工具”→“开发者工具”,在弹出的页面中单击“Console”选项卡,就可以看到图1-6所示的JavaScript运行环境了。
图1-6 Google Chrome浏览器的JavaScript控制台
Mozilla Firefox则是另一款可扩展的浏览器,在Windows、Linux以及macOS这些主流操作系统上都有相应的版本,读者可根据自己的操作系统下载并安装相应的版本。安装完成之后,在任何网页中按“F12”键或在菜单栏中依次单击“工具”→“Web开发者”→“Web控制台”,就可以看到图1-7所示的JavaScript运行环境。
图1-7 Mozilla Firefox浏览器的JavaScript控制台
关于如何在浏览器中具体执行/调试JavaScript脚本,本书的第二部分在讨论浏览器端的JavaScript时会做具体演示,这里只需知道如何搭建并启动这个运行环境。
本章致力于让读者对JavaScript这门编程语言有一个整体的认知,知道它从何而来、它的标准化过程,了解它的组成和特性,以及能发挥其特性优势的领域;然后搭建了用于执行/调试JavaScript脚本的运行环境。在做完以上这些准备之后,下一章就可以开始正式学习JavaScript了。
正如第1章提到的,当我们说到JavaScript这个术语时,其实讨论的通常是两部分的内容:第一部分是被ECMAScript标准所规范的这门语言本身;第二部分则是该语言所在的运行环境。因此,在学习如何具体针对实际运行环境进行浏览器端或服务器端的开发之前,我们得先通过以下几章的内容来熟悉一下JavaScript这门语言本身。