时光荏苒,时间来到了2020年,而我依然是那个菜,即便如此,也总是在内心渴望成为big old。俗话说笨鸟先飞,我并不期待自己能够先飞,但却坚信总会与一天能够飞。也希望能通过这件事情能够在多个方面能够提升自己。本次为连载文章,预计是半个月能更新一章或者两章,这也算立下了一个flag,能够提醒自己即便再忙,也要学习。另外一方面就是,由于本人英语为散装英语,有些地方还是用到了翻译器,可能不是那么准确,也希望能够看到的巨佬能够指出,以便能够及时改进和提升。最后,JavaScript高级程序设计第四版目前国内好像还是图灵的人在弄,如果侵权,请及时提出以便删除,该系列不会作为商业用途,仅供学习参考用。
前两章与第三版并没有什么大的改动,于是我便跳过了。
第一部分JavaScript基础
本章内容:
- 复习基础语法
- 数据类型的使用
- 变量声明
- 函数讲解
任何语言的核心都是描述它最底层上应该如何去运行,这种描述通常表现为定义语法、运算符、数据类型和内置功能 等可以去提供构建复杂的解决方案。 ECMA-262以一种称为ECMAScript的伪语言的形式为JavaScript定义了所有这些信息。
ECMA-262第五版中定义的ECMAScript是在 网络浏览器。第六版是下一个将在浏览器中实现的版本,截止到 2017年,大多数主流浏览器已经基本或完全实现了该规范。因为这个原因, 以下信息主要基于第六版中定义的ECMAScript。
关于语法
ECMAScript的语法大量借用了C和其他类似C的语言,如Java和Perl。 熟悉这类语言的开发人员应该很容易掌握 ECMAScript的语法更松散。
关于大小写
首先需要理解一个概念,所有的内容都是区分大小写的;变量、函数名、运算符等都是区分大小写的 这样就很容易的去区分出它们test于Test是不同的。类似的情况还有typeof不能用来当作函数的名称, 因为typeof是一个关键字。 但是在后面一节中typeof是一个有效的函数名。
标识符
标识符是变量、函数、属性或者函数的名称。标识符可以是下列形式的一个或多个字符:1、第一个字母必须是字母、下划线(_)或者$符。2、所有其他字符可以是字母、下划线、$符或者数字。
标识符中的字母可以包括扩展的Ascll或Unicode字母字符,例如 À 和 Æ ,但是不建议这样使用
按照习惯,ECMScript标识符使用驼峰式命名法,第一个字符是小写,后面每个单词的第一个字母大写 例如:firstSecond
myCar
doSomethingImportant
虽然没有严格要求这样,但是我们还是应该按照ECMScript遵守这样的命名方式。
注意:关键字、保留字、true、false和null不能用作标识符。请参照后续“关键字和保留字”部分
注释
ECMAScript对单行和块注释都使用C样式的注释。单行注释 以两个正斜杠字符开头,例如:
// 这是一个双斜杠注释
块注释以正斜杠和星号(/*)开头,以相反的(*/)结尾,如 这个例子:
/* 这是一个块注释 */
严格模式
ECMAScript 5引入了严格模式的概念,严格模式下的JavaScript是一种不同的解析和执行模式, 其中处理了ECMAScript 3中的一些不稳定行为和一些不安全的因素。如果要开启严格模式,则需要在顶端写上:
"use strict";
看起来像是普通的字符串,但是这是一个标识,它会告诉JavaScript引擎,这段代码需要转换成严格模式。 这里之所以这样写,是为了避免对ECMScript 3造成一些不必要的影响。
你还可以在指定的函数体中使用严格模式:
function doSomething() {
"use strict"
// function body
}
严格模式改变了许多JavaScript的执行过程,为了区分,在本书中,所有的严格模式都将会指出。
声明
ECMAScript中以分号标识结束,但是也可以省略不写,如下所示:
let sum = a +b // 这样写也是没有问题的,但是不推荐这样做
let diff = a - b; // 推荐写法
即使在语句末尾不需要分号,也应该始终包含分号。写上分号有助于防止遗漏错误, 例如没有完成键入的内容,并允许开发人员通过删除额外的空格来压缩ECMAScript代码 (当行不以分号结尾时,这种压缩会导致语法错误)。在某些情况下, 包含分号还可以提高性能,因为语法分析器会通过在分号所属的位置插入分号来更正语法错误
通过使用C样式语法,可以将多个语句组合到一个代码块中,从左大括号({)开始,到右大括号(})结束:
if (test) {
test = false;
console.log(test);
}
控制语句(如if)只在执行多个语句时需要代码块。但是,最好始终将代码块与控制语句一起使用,即使只有一条语句要执行,如下例所示:
// 这样写是没问题的,但是很容易出错,所以不推荐这样写
if (test)
console.log(test);
// 推荐写法
if (test) { console.log(test) }
对控制语句使用代码块可以使意图更清晰,并且在需要进行更改时出错的可能性更小
关键字和保留词
ECMA-262描述一组具有特定用途的保留关键字,例如指示控制语句的开始或结束或执行特定操作。 根据规则,关键字是保留的,不能用作标识符或属性名。ECMA-262第六版的完整关键字列表如下:
break 、 do 、 in typeof、
case 、 else、 instanceof 、 var、
catch、 export 、 new、 void
class 、 extends 、 return 、 while
const、 finally 、 super 、 with
continue 、 for 、 switch、 yield
debugger 、 function 、 this 、 default
if、 throw、 delete 、 import
try
规范还提出了一组将来不能用作标识符或属性名的保留字。尽管保留词在语言中没有任何特定用法,但它们保留了作为关键字供将来使用。
以下是ECMA-262第六版中定义的未来保留字的完整列表:
一直保留的:
enum
以严格模式保留:
implements、 package 、 public 、 interface
protected 、 static、 let 、 private
Reserved、 in
在代码块中保留的:
await
这些词仍然不能用作标识符,但现在可以用作对象中的属性名。 一般来说,最好避免同时使用关键字和保留字作为标识符和属性名, 以确保向下和向上的ECMAScript版本兼容。
变量
ECMAScript变量是松散类型的,这意味着变量可以保存任何类型的数据。 每个变量只是一个值的命名占位符。 有三个关键字可用于声明变量:var(在所有ECMAScript版本中都可用)和const和let(在ECMAScript 6中引入)。
关键字:var
如果要使用var定义变量,前面写var(注意:var是一个关键字),后面跟变量名(前面描述的标识符),比如:
var message;
这段代码定义了一个名为message,它可以用来保存任何值。(如果不进行初始化,则保留未定义的特殊值 ,这将在下一节中讨论)。ECMAScript实现变量初始化,因此可以同事定义变量并设值,例如:
var message = "hi";
这里我们将message变量定义为包含字符串值"hi",执行此初始化不会将变量标记为字符串类型;它只是为变量赋值。 我们任然可以改变存储在变量中的值或者更改值得类型,例如:
var message = "hi"; message = 100; // 这样做是可以的,但是不推荐这样做
在这个列子中,我们先将变量message的初始值定义为"hi",随后被数值100覆盖,尽管我们不建议这样做,但是在ECMAScript中这样做是可以的
变量声明的作用域
需要注意的是,使用var运算符定义变量会使其成为定义变量的函数作用域的局部变量。 例如,使用var定义函数内部的变量意味着变量在函数退出时被销毁,例如:
function test() { //
var message = "hi"; //
// 局部变量
}
test();
console.log(message); // message 未定义!
在这里,我们在test()函数中使用var声明了一个名为message的变量并初始化了它的值, 紧接着,变量被销毁,因此本例中的最后一行会在控制台中报错。 但是,只需省略var运算符,就可以全局定义变量,如下所示:
function test() { //
message = "hi"; //全局变量
// 局部变量
}
test();
console.log(message); // "hi"
通过从示例中删除var运算符,message变量变为全局变量。一旦调用函数test(),变量就会被定义,并在执行后可在函数外部访问。
注意:虽然可以通过省略var运算符来定义全局变量,但不建议使用这种方法。局部定义的全局变量很难维护,并且会导致混淆。当未声明的变量被赋值时,严格模式下会报引用错误。
如果需要定义多个变量,可以使用单个语句来完成,用逗号将每个变量(和可选初始化)分隔,例如:
var message = "hi",
found = false,
age = 18,
这里,定义并初始化了三个变量。 由于ECMAScript是松散类型的,所以可以将使用不同数据类型的变量初始化组合到单个语句中。 虽然不需要插入换行符和缩进变量,但这有助于提高可读性。 在严格模式下运行时,变量不能定义名为eval或arguments(虽然没有加入关键字或者保留字,但是这样做以然会导致语法错误)。