第 5 章 JavaScript基础 JavaScript最早源自网景(Netscape)公司,1996年,网景将JavaScript提交给 ECMA(前身为EuropeanComputerManufacturesAssociation)进行标准化,1997 年6月,ECMA 以JavaScrit语言为基础制定了ECMAScrit标准规范 ECMA-262 。 pp 与HTML和CSS不同,前两者是W3C的推荐标准,而JavaScript是ECMAScript 标准规范的实现。除JavaScript外,其他语言也实现了ECMAScript标准,如微软 早期的JScript,但因JavaScript最为著名,因此通常提到ECMAScript指的就是 JavaScript。 最初,JavaScript更多是作为一种运行于浏览器中的小脚本语言,为程序员提 供与浏览器交互的能力,但如今它已走出了浏览器的局限,也可运行于非浏览器 环境,其应用领域远远超出了最初的范围。2015年6月,ECMAScript第6版发布 (常简写作ES6或ES2015),在此版本中有许多重大更新。目前多数情形下,若不 特别声明,程序员口中的JavaScript指的即是ES6之后的版本,本书内容基于ES6 讲解,也加入了一些ES6之后版本的内容。目前,ECMAScript是一个相对活跃的 标准,自2015年起,直至本书出版时,每年ECMA均发布了新的ECMAScript标 准,目前通常使用年份作为版本号,如2022年6月正式发布的版本为ECMAScript 2022 。读者可随时关注新版本的变化,若运行环境支持,不妨大胆使用新的语法 特性 J 。 avaScript虽然在名称上与Java相似,但应注意JavaScript与Java语言有本 质上的区别。其一,JavaScript是一种解释型编程语言,简单地说,JavaScript的代 码会在程序运行时被JavaScript解释器(引擎)逐句解释为机器代码执行,Java则 是一种编译型的语言,它的源代码需要经编译器预编译才可执行。其二, JavaScript是一种动态语言,同时也是一种弱类型语言,而Java是静态的强类型语 言。当然,就程序设计语言本身来说,并无本质上的优劣之分,关键看应用场景。 编译型语言因其预先编译往往带来更高的执行效率,静态语言可帮助程序员发现 很多数据类型兼容问题。 如果读者有学习C/C++/Java的经验,会看到JavaScript的许多基本语法与 它们相似,通常把这类语言称作“类C语言”。因此,本书并不打算按部就班地介 绍JavaScript,多数时候会引导读者换一个角度思考,从需求出发,从程序设计的 理念来学习和理解。当然,即使读者从未接触过任何程序设计语言也不必担心, 第5章JavaScript基础99 本书将由浅入深逐步展开,配合精心准备的示例,让读者学有所得。 图灵奖获得者NiklausEmilWirth曾写过一本书Algorithms+DataStructures= Programs《算法+数据结构=程序》,这句话也成了计算机科学的名言。我们至少可从这句 话中读出以下两个信息。 .计算机程序处理的核心内容是数据,因此首先要解决的问题即是如何合理地表达和 存储数据。 .计算机程序按照一定的算法对数据进行处理,最终输出结果。 因为不同类型的数据在计算机内部有着不同的表达、存储、运算方式,因此发展出了“数 据类型”的概念。计算机程序设计语言中,一般都包括如下基本数据类型。 (1)数值型:如1、-2 、3.14,因内部存储机制的不同,数值型又被细分为定点数 (integer,整数)和浮点数(float,小数) 。根据存储空间大小的不同,以及是否表达负数,又可 再细分为更多子类型。 (2)字符型:如字母、汉字,狭义地指单个的字符(char), 广义地包含字符串(string) 。 (3)布尔型:只表达真(true)或假(false) 。 为了使用方便,许多程序设计语言中还会支持更高级的数据类型,但通常由以上基本数 据类型来表达。 如果数据项之间没有关系,则称作离散型数据,而进入计算机世界的数据之间往往是有 关联的,为表达这种数据之间的关系,发展出了“数据结构”的概念,即定义一定的存储结构 来表达数据之间的关系,同时定义针对不同数据类型和数据结构的运算/操作规则。 读到这里,读者也许会有这样的疑问:这与我们要学习的知识有何关系? 如果读者有 学习任何一门程序设计语言的经验,不妨将教材翻开对照一下,通常第一部分介绍的就是以 上内容在具体程序设计语言中的实现:数据类型、变量、常量、数组、运算符…… 若是面向对 象语言,也许会涉及一些常用的高级数据类型,如String、Date,以及它们所支持的操作。这 些概念其实就可归入上述三个层次:数据类型、数据结构、运算/操作规则。 计算机算法通过将多条语句按一定规则组合在一起以实现特定的功能,这便涉及程序 设计语言中的控制语句。当需要解决的问题变得复杂时,为便于管理和复用,同时保持程序 的可维护性,将相对独立的功能模块进行封装便形成了函数。而在面向对象程序设计语言 中,又更进一步地将数据和功能逻辑封装为一个整体,即对象。 本章内容将围绕上述主题逐层展开,以下是总体规划,希望读者在学习技术细节的同 时,也能理解这些技术所要实现的宏观目标。 1节:介绍常用的数据类型、数据结构和声明方式。 5. 2节:深入讨论数据的存储方式。 5. 3节:介绍基本运算与操作规则。 5. 5.即控制语句。 4节:介绍控制逻辑的表达, 5.即函数的定义和使用。 5节:讨论功能逻辑的封装, 5.即对象和类。 6节:进一步探讨数据与功能逻辑的封装, 1 00 Web应用开发技术(微课版) 视频讲解 .. 5.1 数据类型与数据声明 5.1.1 基本数据类型 基本数据类型也称原始数据类型,其值被称作原始值。JavaScript的基本数据类型包 括:number、bigint、string、boolean、null、undefined和symbol。 1.number JavaScript中,无论是整数还是小数均按number类型处理,始终使用IEEE754标准中 的64位双精度浮点数来表示。 . 表达范围:±1.7976931348623157×10308之间。 . 最小值:±5×10-324,可表达的最接近0的数。 对于整数,可安全表达的范围为±(253-1),超出此范围则不能精确表达,此时可使用 bigint类型。 整数的字面量①可使用十进制、八进制(以0开头)或十六进制(以0x或0X开头)表示。 例如,十进制数14可写作14(十进制)、016(八进制)或0xE(十六进制)。浮点数的字面量 可直接使用十进制数表示,或使用科学记数法,例如,3.14、0.314e1、0.314E1。 以下为常用的number类型特殊值/常量。 . NaN:NotaNumber,即从数据类型看该值属于number类型,但并非合法的数值。 例如,执行"A"*2的结果即为NaN。 .Infinity/-Infinity:正/负无穷。 . Number.MAX_VALUE:1.7976931348623157×10308(number类型最大值)。 . Number.MIN_VALUE:5×10-324,最接近0的正数。 . Number.MIN_SAFE_INTEGER:-253+1,可安全表达的最小整数。 . Number.MAX_SAFE_INTEGER:+253-1,可安全表达的最大整数。 . Number.NEGATIVE_INFINITY:-Infinity,负无穷。 . Number.POSITIVE_INFINITY:Infinity,正无穷。 2.bigint bigint是ES2020新加入的基本数据类型,可以表达任意大小的整数,且不限制其所占 用的字节数。bigint字面量以字母n结尾,例如,3n、-5n。适用于number类型的运算大 部分也适用于bigint类型,但注意表达式中不可混用number和bigint,例如,3+3n是错误 的表达式,应做显式类型转换,如3+number(3n)或bigint(3)+3n。 3.string JavaScript中无论单个字符还是多个字符(字符串)都按string类型处理。string类型 的字面量必须使用单引号(')或双引号(")为定界符。 字符串字面量中若出现特殊字符,应使用反斜杠(\)进行转义,例如,\n(换行,New Line)、\r(回车,CarriageReturn)、\'(单引号)、\"(双引号)。也可使用\xXX 或\uXXXX ① 字面量(literal,直接量)即程序中直接书写的值,如18、3.14。 第5章 JavaScript基础1 01 指定Latin-1或Unicode字符,其中,“X”为十六进制数值,如\u000D(回车符)。 在ES6中增加了反引号(`)可用于定义字符串模板字面量,此时特殊字符无须转义,也 可用于定义多行字符串。下面的代码展示了Hes' oftencalled"Johnny" 这样一个句子,分 别使用单引号、双引号、反引号定义字面量的写法。 He\'s often called "Johnny"' "He's often called \"Johnny\"" `He's often called "Johnny"` 4.boolean 布尔型(boolean)数据的取值只能为true(真)或false(假),称作布尔值或逻辑数。 在布尔上下文①中,false、0、-0、0n(bigint类型的0)、""(空字符串)、null、undefined、 NaN均被认定为false,这些值被统称作falsy(假值),其余情况均认定为true,统称作truthy (真值)。 5.null null表示无效的对象或地址引用。null和undefined有时被统称为nullish。 6.undefined undefined表示未赋初始值的变量,或未获得值的形式参数(形参)。 7.symbol ES6中新增的symbol类型用于表示唯一的、不可更改的值,使用Symbol()函数创建。 常可用作对象属性的键(key)或数据对象的唯一标识(id)。 5.1.2 数据声明 1.变量 程序中若需要空间存储数据,可使用如下代码进行声明(declare)。 let x 以上代码声明了一个变量(variable),x为变量名。此时变量x并没有具体的值,它的 值即为undefined。之所以称作“变量”,是因为其值可以被更改。 作为弱类型的动态程序设计语言,JavaScript中声明变量时无须明确数据类型,而变量 具体的数据类型视其值而定。可看到如下代码中,随着程序逐行向下执行时变量x的值在 变化,其数据类型也随之改变。 let x=3 //x 值为3, number 类型 x='Hello' //x 值变为'Hello', string 类型 x=true //x 值变为true, boolean 类型 代码中的等号(=)意为赋值,即将等号右边的值赋给左边的变量,在声明变量时可以直 接为其赋值(如上述代码第1行)。 “//…”为注释,若需要注释多行内容可使用“/*…*/”。此外,注意JavaScript是一种 区分大小写的语言。 在ES6之前的版本中,声明变量使用关键词var,例如,varx=3,但ES6之后更建议使 ① 布尔上下文(booleancontext):可理解为程序中需要使用布尔表达式的位置,如if(…)的“()”内。 1 02 Web应用开发技术(微课版) 用let,5.4.1节将详细对比它们的区别。 接下来学习如何将JavaScript代码嵌入网页。请创建如下所示的HTML文件,并将 JavaScript代码写入标签内,浏览器加载页面时便会自动执行。 code-5.1.html
请打开"开发者工具"切换至"Console"标签页
以上代码中console.log()用于向控制台输出信息,为便于理解,注释中以“>>>”表示 程序在此行向控制台实际输出的内容。 在浏览器中打开code-5.1.html,并切换至开发者工具的Console标签页(控制台),便可 看如图5.1所示的程序运行结果。 图5.1 在开发者工具中查看控制台输出 更佳的做法是将JavaScript代码移至独立的js文件中(jscode.js),并使用