前言:
学习一门编程语言的基本步骤
(01)了解背景知识javascript
1.了解背景知识
1)什么是 JavaScript 语言?
JavaScript 是一种轻量级的脚本语言。所谓“脚本语言”(script language),指的是它不具有开发操做系统的能力,而是只用来编写控制其余大型应用程序(好比浏览器)的“脚本”。
JavaScript 也是一种嵌入式(embedded)语言。它自己提供的核心语法不算不少,只能用来作一些数学和逻辑运算。JavaScript 自己不提供任何与 I/O(输入/输出)相关的 API,都要靠宿主环境(host)提供,因此 JavaScript 只合适嵌入更大型的应用程序环境,去调用宿主环境提供的底层 API。
目前,已经嵌入 JavaScript 的宿主环境有多种,最多见的环境就是浏览器,另外还有服务器环境,也就是 Node 项目。
从语法角度看,JavaScript 语言是一种“对象模型”语言。各类宿主环境经过这个模型,描述本身的功能和操做接口,从而经过 JavaScript 控制这些功能。可是,JavaScript 并非纯粹的“面向对象语言”,还支持其余编程范式(好比函数式编程)。这致使几乎任何一个问题,JavaScript 都有多种解决方法。阅读本书的过程当中,你会诧异于 JavaScript 语法的灵活性。
JavaScript 的核心语法部分至关精简,只包括两个部分:基本的语法构造(好比操做符、控制结构、语句)和标准库(就是一系列具备各类功能的对象好比Array、Date、Math等)。除此以外,各类宿主环境提供额外的 API(即只能在该环境使用的接口),以便 JavaScript 调用。以浏览器为例,它提供的额外 API 能够分红三大类。
浏览器控制类:操做浏览器
DOM 类:操做网页的各类元素
Web 类:实现互联网的各类功能
若是宿主环境是服务器,则会提供各类操做系统的 API,好比文件操做 API、网络通讯 API等等。这些你均可以在 Node 环境中找到。html
2)为何学习 JavaScript?
JavaScript 语言有一些显著特色,使得它很是值得学习。它既适合做为学习编程的入门语言,也适合看成平常开发的工做语言。它是目前最有但愿、前途最光明的计算机语言之一。
2.1)操控浏览器的能力
JavaScript 的发明目的,就是做为浏览器的内置脚本语言,为网页开发者提供操控浏览器的能力。它是目前惟一一种通用的浏览器脚本语言,全部浏览器都支持。它可让网页呈现各类特殊效果,为用户提供良好的互动体验。
目前,全世界几乎全部网页都使用 JavaScript。若是不用,网站的易用性和使用效率将大打折扣,没法成为操做便利、对用户友好的网站。
对于一个互联网开发者来讲,若是你想提供漂亮的网页、令用户满意的上网体验、各类基于浏览器的便捷功能、先后端之间紧密高效的联系,JavaScript 是必不可少的工具。
2.2)普遍的使用领域
近年来,JavaScript 的使用范围,慢慢超越了浏览器,正在向通用的系统语言发展。
(1)浏览器的平台化
随着 HTML5 的出现,浏览器自己的功能愈来愈强,再也不仅仅能浏览网页,而是愈来愈像一个平台,JavaScript 所以得以调用许多系统功能,好比操做本地文件、操做图片、调用摄像头和麦克风等等。这使得 JavaScript 能够完成许多之前没法想象的事情。
(2)Node
Node 项目使得 JavaScript 能够用于开发服务器端的大型项目,网站的先后端都用 JavaScript 开发已经成为了现实。有些嵌入式平台(Raspberry Pi)可以安装 Node,因而 JavaScript 就能为这些平台开发应用程序。
(3)数据库操做
JavaScript 甚至也能够用来操做数据库。NoSQL 数据库这个概念,自己就是在 JSON(JavaScript Object Notation)格式的基础上诞生的,大部分 NoSQL 数据库容许 JavaScript 直接操做。基于 SQL 语言的开源数据库 PostgreSQL 支持 JavaScript 做为操做语言,能够部分取代 SQL 查询语言。
(4)移动平台开发
JavaScript 也正在成为手机应用的开发语言。通常来讲,安卓平台使用 Java 语言开发,iOS 平台使用 Objective-C 或 Swift 语言开发。许多人正在努力,让 JavaScript 成为各个平台的通用开发语言。
PhoneGap 项目就是将 JavaScript 和 HTML5 打包在一个容器之中,使得它能同时在 iOS 和安卓上运行。Facebook 公司的 React Native 项目则是将 JavaScript 写的组件,编译成原生组件,从而使它们具有优秀的性能。
Mozilla 基金会的手机操做系统 Firefox OS,更是直接将 JavaScript 做为操做系统的平台语言,可是很惋惜这个项目没有成功。
(5)内嵌脚本语言
愈来愈多的应用程序,将 JavaScript 做为内嵌的脚本语言,好比 Adobe 公司的著名 PDF 阅读器 Acrobat、Linux 桌面环境 GNOME 3。
(6)跨平台的桌面应用程序
Chromium OS、Windows 8 等操做系统直接支持 JavaScript 编写应用程序。Mozilla 的 Open Web Apps 项目、Google 的 Chrome App 项目、GitHub 的 Electron 项目、以及 TideSDK 项目,均可以用来编写运行于 Windows、Mac OS 和 Android 等多个桌面平台的程序,不依赖浏览器。
(7)小结
能够预期,JavaScript 最终将能让你只用一种语言,就开发出适应不一样平台(包括桌面端、服务器端、手机端)的程序。早在2013年9月的统计之中,JavaScript 就是当年 GitHub 上使用量排名第一的语言。
著名程序员 Jeff Atwood 甚至提出了一条 “Atwood 定律”:
“全部能够用 JavaScript 编写的程序,最终都会出现 JavaScript 的版本。”(Any application that can be written in JavaScript will eventually be written in JavaScript.)
2.3)易学性
相比学习其余语言,学习 JavaScript 有一些有利条件。
(1)学习环境无处不在
只要有浏览器,就能运行 JavaScript 程序;只要有文本编辑器,就能编写 JavaScript 程序。这意味着,几乎全部电脑都原生提供 JavaScript 学习环境,不用另行安装复杂的 IDE(集成开发环境)和编译器。
(2)简单性
相比其余脚本语言(好比 Python 或 Ruby),JavaScript 的语法相对简单一些,自己的语法特性并非特别多。并且,那些语法中的复杂部分,也不是必须要学会。你彻底能够只用简单命令,完成大部分的操做。
(3)与主流语言的类似性
JavaScript 的语法很相似 C/C++ 和 Java,若是学过这些语言(事实上大多数学校都教),JavaScript 的入门会很是容易。
必须说明的是,虽然核心语法不难,可是 JavaScript 的复杂性体如今另外两个方面。
首先,它涉及大量的外部 API。JavaScript 要发挥做用,必须与其余组件配合,这些外部组件五花八门,数量极其庞大,几乎涉及网络应用的各个方面,掌握它们绝非易事。
其次,JavaScript 语言有一些设计缺陷。某些地方至关不合理,另外一些地方则会出现怪异的运行结果。学习 JavaScript,很大一部分时间是用来搞清楚哪些地方有陷阱。Douglas Crockford 写过一本有名的书,名字就叫《JavaScript: The Good Parts》,言下之意就是这门语言很差的地方不少,必须写一本书才能讲清楚。另一些程序员则感到,为了更合理地编写 JavaScript 程序,就不能用 JavaScript 来写,而必须发明新的语言,好比 CoffeeScript、TypeScript、Dart 这些新语言的发明目的,多多少少都有这个因素。
尽管如此,目前看来,JavaScript 的地位仍是没法动摇。加之,语言标准的快速进化,使得 JavaScript 功能日益加强,而语法缺陷和怪异之处获得了弥补。因此,JavaScript 仍是值得学习,何况它的入门真的不难。
2.4)强大的性能
JavaScript 的性能优点体如今如下方面。
(1)灵活的语法,表达力强。
JavaScript 既支持相似 C 语言清晰的过程式编程,也支持灵活的函数式编程,能够用来写并发处理(concurrent)。这些语法特性已经被证实很是强大,能够用于许多场合,尤为适用异步编程。
JavaScript 的全部值都是对象,这为程序员提供了灵活性和便利性。由于你能够很方便地、按照须要随时创造数据结构,不用进行麻烦的预约义。
JavaScript 的标准还在快速进化中,并不断合理化,添加更适用的语法特性。
(2)支持编译运行。
JavaScript 语言自己,虽然是一种解释型语言,可是在现代浏览器中,JavaScript 都是编译后运行。程序会被高度优化,运行效率接近二进制程序。并且,JavaScript 引擎正在快速发展,性能将愈来愈好。
此外,还有一种 WebAssembly 格式,它是 JavaScript 引擎的中间码格式,所有都是二进制代码。因为跳过了编译步骤,能够达到接近原生二进制代码的运行速度。各类语言(主要是 C 和 C++)经过编译成 WebAssembly,就能够在浏览器里面运行。
(3)事件驱动和非阻塞式设计。
JavaScript 程序能够采用事件驱动(event-driven)和非阻塞式(non-blocking)设计,在服务器端适合高并发环境,普通的硬件就能够承受很大的访问量
2.5)开放性
JavaScript 是一种开放的语言。它的标准 ECMA-262 是 ISO 国际标准,写得很是详尽明确;该标准的主要实现(好比 V8 和 SpiderMonkey 引擎)都是开放的,并且质量很高。这保证了这门语言不属于任何公司或我的,不存在版权和专利的问题。
语言标准由 TC39 委员会负责制定,该委员会的运做是透明的,全部讨论都是开放的,会议记录都会对外公布。
不一样公司的 JavaScript 运行环境,兼容性很好,程序不作调整或只作很小的调整,就能在全部浏览器上运行。java
3)JavaScript语言的诞生
JavaScript 由于互联网而生,紧跟着浏览器的出现而问世。回顾它的历史,就要从浏览器的历史讲起。
1990年末,欧洲核能研究组织(CERN)科学家 Tim Berners-Lee,在全世界最大的电脑网络——互联网的基础上,发明了万维网(World Wide Web),今后能够在网上浏览网页文件。最先的网页只能在操做系统的终端里浏览,也就是说只能使用命令行操做,网页都是在字符窗口中显示,这固然很是不方便。
1992年末,美国国家超级电脑应用中心(NCSA)开始开发一个独立的浏览器,叫作 Mosaic。这是人类历史上第一个浏览器,今后网页能够在图形界面的窗口浏览。
1994年10月,NCSA 的一个主要程序员 Marc Andreessen 联合风险投资家 Jim Clark,成立了 Mosaic 通讯公司(Mosaic Communications),不久后更名为 Netscape。这家公司的方向,就是在 Mosaic 的基础上,开发面向普通用户的新一代的浏览器 Netscape Navigator。
1994年12月,Navigator 发布了1.0版,市场份额一举超过90%。
Netscape 公司很快发现,Navigator 浏览器须要一种能够嵌入网页的脚本语言,用来控制浏览器行为。当时,网速很慢并且上网费很贵,有些操做不宜在服务器端完成。好比,若是用户忘记填写“用户名”,就点了“发送”按钮,到服务器再发现这一点就有点太晚了,最好能在用户发出数据以前,就告诉用户“请填写用户名”。这就须要在网页中嵌入小程序,让浏览器检查每一栏是否都填写了。
管理层对这种浏览器脚本语言的设想是:功能不须要太强,语法较为简单,容易学习和部署。那一年,正逢 Sun 公司的 Java 语言问世,市场推广活动很是成功。Netscape 公司决定与 Sun 公司合做,浏览器支持嵌入 Java 小程序(后来称为 Java applet)。可是,浏览器脚本语言是否就选用 Java,则存在争论。后来,仍是决定不使用 Java,由于网页小程序不须要 Java 这么“重”的语法。可是,同时也决定脚本语言的语法要接近 Java,而且能够支持 Java 程序。这些设想直接排除了使用现存语言,好比 Perl、Python 和 TCL。
1995年,Netscape 公司雇佣了程序员 Brendan Eich 开发这种网页脚本语言。Brendan Eich 有很强的函数式编程背景,但愿以 Scheme 语言(函数式语言鼻祖 LISP 语言的一种方言)为蓝本,实现这种新语言。
1995年5月,Brendan Eich 只用了10天,就设计完成了这种语言的初版。它是一个大杂烩,语法有多个来源。
基本语法:借鉴 C 语言和 Java 语言。
数据结构:借鉴 Java 语言,包括将值分红原始值和对象两大类。
函数的用法:借鉴 Scheme 语言和 Awk 语言,将函数看成第一等公民,并引入闭包。
原型继承模型:借鉴 Self 语言(Smalltalk 的一种变种)。
正则表达式:借鉴 Perl 语言。
字符串和数组处理:借鉴 Python 语言。
为了保持简单,这种脚本语言缺乏一些关键的功能,好比块级做用域、模块、子类型(subtyping)等等,可是能够利用现有功能找出解决办法。这种功能的不足,直接致使了后来 JavaScript 的一个显著特色:对于其余语言,你须要学习语言的各类功能,而对于 JavaScript,你经常须要学习各类解决问题的模式。并且因为来源多样,从一开始就注定,JavaScript 的编程风格是函数式编程和面向对象编程的一种混合体。
Netscape 公司的这种浏览器脚本语言,最初名字叫作 Mocha,1995年9月改成 LiveScript。12月,Netscape 公司与 Sun 公司(Java 语言的发明者和全部者)达成协议,后者容许将这种语言叫作 JavaScript。这样一来,Netscape 公司能够借助 Java 语言的声势,而 Sun 公司则将本身的影响力扩展到了浏览器。
之因此起这个名字,并非由于 JavaScript 自己与 Java 语言有多么深的关系(事实上,二者关系并不深,详见下节),而是由于 Netscape 公司已经决定,使用 Java 语言开发网络应用程序,JavaScript 能够像胶水同样,将各个部分链接起来。固然,后来的历史是 Java 语言的浏览器插件失败了,JavaScript 反而发扬光大。
1995年12月4日,Netscape 公司与 Sun 公司联合发布了 JavaScript 语言,对外宣传 JavaScript 是 Java 的补充,属于轻量级的 Java,专门用来操做网页。
1996年3月,Navigator 2.0 浏览器正式内置了 JavaScript 脚本语言。程序员
3.1)JavaScript 与 Java 的关系
这里专门说一下 JavaScript 和 Java 的关系。它们是两种不同的语言,可是彼此存在联系。
JavaScript 的基本语法和对象体系,是模仿 Java 而设计的。可是,JavaScript 没有采用 Java 的静态类型。正是由于 JavaScript 与 Java 有很大的类似性,因此这门语言才从一开始的 LiveScript 更名为 JavaScript。基本上,JavaScript 这个名字的原意是“很像Java的脚本语言”。
JavaScript 语言的函数是一种独立的数据类型,以及采用基于原型对象(prototype)的继承链。这是它与 Java 语法最大的两点区别。JavaScript 语法要比 Java 自由得多。
另外,Java 语言须要编译,而 JavaScript 语言则是运行时由解释器直接执行。
总之,JavaScript 的原始设计目标是一种小型的、简单的动态语言,与 Java 有足够的类似性,使得使用者(尤为是 Java 程序员)能够快速上手。正则表达式
3.2)JavaScript 与 ECMAScript 的关系
1996年8月,微软模仿 JavaScript 开发了一种相近的语言,取名为JScript(JavaScript 是 Netscape 的注册商标,微软不能用),首先内置于IE 3.0。Netscape 公司面临丧失浏览器脚本语言的主导权的局面。
1996年11月,Netscape 公司决定将 JavaScript 提交给国际标准化组织 ECMA(European Computer Manufacturers Association),但愿 JavaScript 可以成为国际标准,以此抵抗微软。ECMA 的39号技术委员会(Technical Committee 39)负责制定和审核这个标准,成员由业内的大公司派出的工程师组成,目前共25我的。该委员会按期开会,全部的邮件讨论和会议记录,都是公开的。
1997年7月,ECMA 组织发布262号标准文件(ECMA-262)的初版,规定了浏览器脚本语言的标准,并将这种语言称为 ECMAScript。这个版本就是 ECMAScript 1.0 版。之因此不叫 JavaScript,一方面是因为商标的关系,Java 是 Sun 公司的商标,根据一份受权协议,只有 Netscape 公司能够合法地使用 JavaScript 这个名字,且 JavaScript 已经被 Netscape 公司注册为商标,另外一方面也是想体现这门语言的制定者是 ECMA,不是 Netscape,这样有利于保证这门语言的开放性和中立性。所以, ECMAScript 和 JavaScript 的关系是,前者是后者的规格,后者是前者的一种实现。在平常场合,这两个词是能够互换的。
ECMAScript 只用来标准化 JavaScript 这种语言的基本语法结构,与部署环境相关的标准都由其余标准规定,好比 DOM 的标准就是由 W3C组织(World Wide Web Consortium)制定的。
ECMA-262 标准后来也被另外一个国际标准化组织 ISO(International Organization for Standardization)批准,标准号是 ISO-16262。数据库
3.3)JavaScript 的版本
1997年7月,ECMAScript 1.0发布。
1998年6月,ECMAScript 2.0版发布。
1999年12月,ECMAScript 3.0版发布,成为 JavaScript 的通行标准,获得了普遍支持。
2007年10月,ECMAScript 4.0版草案发布,对3.0版作了大幅升级,预计次年8月发布正式版本。草案发布后,因为4.0版的目标过于激进,各方对因而否经过这个标准,发生了严重分歧。以 Yahoo、Microsoft、Google 为首的大公司,反对 JavaScript 的大幅升级,主张小幅改动;以 JavaScript 创造者 Brendan Eich 为首的 Mozilla 公司,则坚持当前的草案。
2008年7月,因为对于下一个版本应该包括哪些功能,各方分歧太大,争论过于激进,ECMA 开会决定,停止 ECMAScript 4.0 的开发(即废除了这个版本),将其中涉及现有功能改善的一小部分,发布为 ECMAScript 3.1,而将其余激进的设想扩大范围,放入之后的版本,因为会议的气氛,该版本的项目代号起名为 Harmony(和谐)。会后不久,ECMAScript 3.1 就更名为 ECMAScript 5。
2009年12月,ECMAScript 5.0版 正式发布。Harmony 项目则一分为二,一些较为可行的设想定名为 JavaScript.next 继续开发,后来演变成 ECMAScript 6;一些不是很成熟的设想,则被视为 JavaScript.next.next,在更远的未来再考虑推出。TC39 的整体考虑是,ECMAScript 5 与 ECMAScript 3 基本保持兼容,较大的语法修正和新功能加入,将由 JavaScript.next 完成。当时,JavaScript.next 指的是ECMAScript 6。第六版发布之后,将指 ECMAScript 7。TC39 预计,ECMAScript 5 会在2013年的年中成为 JavaScript 开发的主流标准,并在此后五年中一直保持这个位置。
2011年6月,ECMAScript 5.1版发布,而且成为 ISO 国际标准(ISO/IEC 16262:2011)。到了2012年末,全部主要浏览器都支持 ECMAScript 5.1版的所有功能。
2013年3月,ECMAScript 6 草案冻结,再也不添加新功能。新的功能设想将被放到 ECMAScript 7。
2013年12月,ECMAScript 6 草案发布。而后是12个月的讨论期,听取各方反馈。
2015年6月,ECMAScript 6 正式发布,而且改名为“ECMAScript 2015”。这是由于 TC39 委员会计划,之后每一年发布一个 ECMAScript 的版本,下一个版本在2016年发布,称为“ECMAScript 2016”,2017年发布“ECMAScript 2017”,以此类推。编程