元数据

JavaScript权威指南(原书第6版)

  •  JavaScript权威指南(原书第6版)|200
  • 书名: JavaScript权威指南(原书第6版)
  • 作者: 弗兰纳根
  • 简介: “本书要讲述的内容涵盖JavaScript语言本身,以及Web浏览器所实现的JavaScript API。本书更适合有一定编程经验的人阅读。对于那些希望学习JavaScript和已经开始使用JavaScript的程序员来说,如果想让自己对JavaScript语言和Web平台的理解和掌握再上一个台阶,本书最适合不过了。“
  • 出版时间 2012-04-25 00:00:00
  • ISBN: 9787111376613
  • 分类: 计算机-编程设计
  • 出版社: 机械工业出版社
  • PC地址:https://weread.qq.com/web/reader/0513214059343c051f11bc8

高亮划线

第1章 JavaScript概述

📌 JavaScript也是前端开发工程师必须掌握的三种技能之一:描述网页内容的HTML、描述网页样式的CSS以及描述网页行为的JavaScript。 ⏱ 2020-09-06 22:11:13

📌 是一门高端的、动态的、弱类型的编程语言,非常适合面向对象和函数式的编程风格 ⏱ 2020-09-06 22:11:24

📌 JavaScript早已超出了其“脚本语言”(scripting-language)本身的范畴,而成为一种集健壮性、高效性和通用性为一身的编程语言。 ⏱ 2020-09-06 22:11:41

📌 通常每一种编程语言都有各自的开发平台、标准库或API函数,用来提供诸如基本输入输出的功能 ⏱ 2020-09-06 22:14:43

📌 本书第一部分涵盖了语言本身的特性以及少量的内置API。第二部分讲解了JavaScript如何在Web浏览器中工作,并涵盖基于浏览器的API——这部分也称做“客户端JavaScript”。 ⏱ 2020-09-06 22:15:14

📌 本书第三部分是核心API的参考手册 ⏱ 2020-09-06 22:15:21

📌 学习一门新的编程语言绝非易事,当然要完整描述这门语言就没办法苛求知识点的循次渐进,每一种语言特性都和其他特性相互关联, ⏱ 2020-09-06 22:15:36

1.1 JavaScript语言核心

📌 对象和数组在JavaScript中是如此之重要,以至于你在本书中处处都能看到它们的身影。 ⏱ 2020-09-06 22:32:37

📌 以分号结束的行均是一条语句 ⏱ 2020-09-06 23:16:51

📌 而语句并不包含一个值(或者说它包含的值我们并不关心),但它们改变程序的运行状态。 ⏱ 2020-09-06 23:17:10

📌 变量声明语句和赋值语句 ⏱ 2020-09-06 23:18:08

1.2 客户端JavaScript

📌 Web浏览器端脚本技术,并涵盖客户端JavaScript中的一些重要全局函数 ⏱ 2020-09-06 23:48:26

第一部分JavaScript语言核心

📌 学习之初通读一遍该部分,以后在遇到JavaScript的难点时,回到这里重新查阅相关内容以巩固知识的掌握: ⏱ 2020-09-07 00:24:18

2.1 字符集

📌 JavaScript程序是用Unicode字符集编写的 ⏱ 2020-09-07 13:07:35

📌 JavaScript是区分大小写的语言。 ⏱ 2020-09-07 13:07:56

📌 HTML并不区分大小写(尽管XHTML区分大小写) ⏱ 2020-09-07 13:08:06

📌 例如,在HTML中设置事件处理程序时,onclick属性可以写成onClick,但在JavaScript代码(或者XHTML文档)中,必须使用小写的onclick。 ⏱ 2020-09-07 13:08:24

📌 JavaScript会忽略程序中标识(token)[插图]之间的空格。 ⏱ 2020-09-07 13:11:50

📌 JavaScript将如下字符识别为行结束符:换行符(\u000A),回车符(\u000D),行分隔符(\u2028),段分隔符(\u2029)。 ⏱ 2020-09-07 13:12:25

📌 在有些计算机硬件和软件里,无法显示或输入Unicode字符全集。为了支持那些使用老旧技术的程序员,JavaScript定义了一种特殊序列,使用6个ASCII字符来代表任意16位 ⏱ 2020-09-07 13:15:59

📌 这两种编码的显示结果一模一样,但它们的二进制编码表示是不一样的,在计算机里也不相等 ⏱ 2020-09-07 13:16:36

2.4 标识符和保留字

📌 JavaScript标识符必须以字母、下划线(_)或美元符($)开始。 ⏱ 2020-09-07 13:21:10

📌 出于可移植性和易于书写的考虑,通常我们只使用ASCII字母和数字来书写标识符。 ⏱ 2020-09-07 13:22:25

📌 ECMAScript5保留了这些关键字: ⏱ 2020-09-07 13:22:54

2.5 可选的分号

📌 在JavaScript中,如果语句各自独占一行,通常可以省略语句之间的分号(程序结尾或右花括号“}”之前的分号也可以省略) ⏱ 2020-09-07 13:25:10

📌 第二个例外是在涉及“++”和“—”运算符(见4.8节)的时候。这些运算符可以作为表达式的前缀,也可以当做表达式的后缀。如果将其用做后缀表达式,它和表达式应当在同一行。 ⏱ 2020-09-07 13:30:03

第3章 类型、值和变量

📌 JavaScript的数据类型分为两类:原始类型(primitive type)和对象类型(objecttype) ⏱ 2020-09-07 14:53:13

📌 JavaScript中的原始类型包括数字、字符串和布尔值, ⏱ 2020-09-07 14:53:17

📌 JavaScript中有两个特殊的原始值:null(空)和undefined(未定义) ⏱ 2020-09-07 14:53:21

📌 JavaScript中除了数字、字符串、布尔值、null和undefined之外的就是对象了。对象(object)是属性(property)的集合,每个属性都由“名/值对”(值可以是原始值,比如数字、字符串,也可以是对象)构成 ⏱ 2020-09-07 14:53:39

📌 JavaScript还定义了另一种特殊对象——函数。函数是具有与它相关联的可执行代码的对象,通过调用函数来运行可执行代码,并返回运算结果。 ⏱ 2020-09-07 14:55:33

3.1 数字

📌 ,JavaScript不区分整数值和浮点数值。JavaScript中的所有数字均用浮点数值表示。JavaScript采用IEEE 754标准[插图]定义的64位浮点格式表示数字, ⏱ 2020-09-07 15:04:32

📌 然而需要注意的是,JavaScript中实际的操作(比如数组索引,以及第4章讲到的位操作符)则是基于32位整数。 ⏱ 2020-09-07 15:15:27

📌 由于某些JavaScript的实现支持八进制直接量,而有些不支持,因此最好不要使用以0为前缀的整型直接量,毕竟我们也无法得知当前JavaScript的实现是否支持八进制的解析。 ⏱ 2020-09-07 15:34:36

📌 JavaScript还支持更加复杂的算术运算,这些复杂运算通过作为Math对象的属性定义的函数和常量来实现: ⏱ 2020-09-07 15:35:29

📌 JavaScript中的算术运算在溢出(overflow)、下溢(underflow)或被零整除时不会报错。当数字运算结果超过了JavaScript所能表示的数字上限(溢出),结果为一个特殊的无穷大(infinity)值,在JavaScript中以Infinity表示。 ⏱ 2020-09-07 15:35:49

📌 无穷大值的行为特性和我们所期望的是一致的:基于它们的加、减、乘和除运算结果还是无穷大值(当然还保留它们的正负号)。 ⏱ 2020-09-07 15:35:58

📌 下溢(underflow)是当运算结果无限接近于零并比JavaScript能表示的最小值还小的时候发生的一种情形。这种情况下,JavaScript将会返回0。当一个负数发生下溢时,JavaScript返回一个特殊的值“负零”。这个值(负零)几乎和正常的零完全一样,JavaScript程序员很少用到负零。 ⏱ 2020-09-07 15:36:15

📌 被零整除在JavaScript并不报错:它只是简单的返回无穷大(Infinity)或负无穷大(-Infinity)。但有一个例外,零除以零是没有意义的,这种整除运算结果也是一个非数字(not-a-number)值,用NaN表示。无穷大除以无穷大、给任意负数作开方运算或者算术运算符与不是数字或无法转换为数字的操作数一起使用时都将返回NaN。 ⏱ 2020-09-07 15:36:36

📌 。ECMAScript 5修正了这个错误,将它们定义为只读的。 ⏱ 2020-09-07 15:39:05

📌 JavaScript中的非数字值有一点特殊:它和任何值都不相等,包括自身。也就是说,没办法通过x==NaN来判断变量x是否是NaN。 ⏱ 2020-09-07 15:37:27

📌 函数isNaN()的作用与此类似,如果参数是NaN或者是一个非数字值(比如字符串和对象),则返回true。JavaScript中有一个类似的函数isFinite(),在参数不是NaN、Infinity或-Infinity的时候返回true。 ⏱ 2020-09-07 15:38:17

📌 当在JavaScript中使用实数的时候,常常只是真实值的一个近似表示。 ⏱ 2020-09-07 15:39:47

📌 这是一种二进制表示法,可以精确地表示分数,比如1/2、1/8和1/1024。遗憾的是,我们常用的分数(特别是在金融计算方面)都是十进制分数1/10、1/100等。二进制浮点数表示法并不能精确表示类似0.1这样简单的数字。 ⏱ 2020-09-07 15:40:03

📌 JavaScript中的数字具有足够的精度,并可以极其近似于0.1。但事实是,数字不能精确表述的确带来了一些问题。看 ⏱ 2020-09-07 15:40:09

📌 :在任何使用二进制浮点数的编程语言中都会有这个问题。 ⏱ 2020-09-07 15:53:38

3.2 文本

📌 JavaScript定义了RegExp()构造函数,用来创建表示文本匹配模式的对象。 ⏱ 2020-09-07 17:09:36

📌 RegExp并不是JavaScript的基本类型。和Date一样,它只是一种具有实用API的特殊对象。正则表达式的语法很复杂,API也很丰富。 ⏱ 2020-09-07 17:09:45

3.3 布尔值

📌 任意JavaScript的值都可以转换为布尔值 ⏱ 2020-09-07 18:37:37

3.4 null和undefined

📌 null是JavaScript语言的关键字,它表示一个特殊值,常用来描述“空值”。对null执行typeof预算,结果返回字符串“object”,也就是说,可以将null认为是一个特殊的对象值,含义是“非对象”。 ⏱ 2020-09-07 18:54:04

📌 用未定义的值表示更深层次的“空值”。 ⏱ 2020-09-07 18:54:19

📌 表明变量没有初始化, ⏱ 2020-09-07 18:54:24

📌 尽管null和undefined是不同的,但它们都表示“值的空缺”,两者往往可以互换 ⏱ 2020-09-07 18:56:35

3.6 包装对象

📌 只要引用了字符串s的属性,JavaScript就会将字符串值通过调用new String(s)的方式转换成对象,这个对象继承了字符串的方法(见6.2.2节),并被用来处理属性的引用。一旦属性引用结束,这个新创建的对象就会销毁(其实在实现上并不一定创建或销毁这个临时对象,然而整个过程看起来是这样) ⏱ 2020-09-07 19:01:53

📌 第二行代码创建一个临时字符串对象,并给其len属性赋值为4,随即销毁这个对象。 ⏱ 2020-09-07 19:09:46

3.7 不可变的原始值和可变的对象引用

📌 不可变的原始值和可变的对象引用 ⏱ 2020-09-07 19:32:32

📌 JavaScript中的原始值(undefined、null、布尔值、数字和字符串)与对象(包括数组和函数)有着根本区别。原始值是不可更改的:任何方法都无法更改(或“突变”)一个原始值。 ⏱ 2020-09-07 19:45:17

📌 原始值的比较是值的比较:只有在它们的值相等时它们才相等 ⏱ 2020-09-07 19:47:32

📌 对象和原始值不同,首先,它们是可变的——它们的值是可修改的 ⏱ 2020-09-07 19:47:50

📌 对象的比较并非值的比较:即使两个对象包含同样的属性及相同的值,它们也是不相等的 ⏱ 2020-09-07 19:48:03

📌 我们通常将对象称为引用类型(reference type),以此来和JavaScript的基本类型区分开来。 ⏱ 2020-09-07 19:48:18

📌 对象值都是引用(reference),对象的比较均是引用的比较:当且仅当它们引用同一个基对象时,它们才相等。 ⏱ 2020-09-07 19:49:54

3.8 类型转换

📌 JavaScript中对象到字符串的转换经过了如下这些步骤: ⏱ 2020-09-07 21:19:44

📌 在对象到数字的转换过程中, ⏱ 2020-09-07 21:19:47

3.10 变量作用域

📌 这意味着变量在声明之前甚至已经可用。 ⏱ 2020-09-07 22:18:23

📌 因此,上述过程等价于:将函数内的变量声明“提前”至函数体顶部,同时变量初始化留在原来的位置: ⏱ 2020-09-07 22:18:08

📌 JavaScript全局变量是全局对象的属性,这是在ECMAScript规范中强制规定的。 ⏱ 2020-09-08 13:17:39

📌 每一段JavaScript代码(全局代码或函数)都有一个与之关联的作用域链(scope chain) ⏱ 2020-09-08 13:40:54

📌 当JavaScript需要查找变量x的值的时候(这个过程称做“变量解析”(variable resolution)),它会从链中的第一个对象开始查找,如果这个对象有一个名为x的属性,则会直接使用这个属性的值,如果第一个对象中不存在名为x的属性,JavaScript会继续查找链上的下一个对象。如果第二个对象依然没有名为x的属性,则会继续查找下一个对象,以此类推。如果作用域链上没有任何一个对象含有属性x,那么就认为这段代码的作用域链上不存在x,并最终抛出一个引用错误(ReferenceError)异常。 ⏱ 2020-09-08 13:41:05

📌 ,第一个是定义函数参数和局部变量的对象,第二个是全局对象 ⏱ 2020-09-08 13:51:21

4.2 对象和数组的初始化表达式

📌 数组直接量中的列表逗号之间的元素可以省略,这时省略的空位会填充值undefined。例如,下面这个数组包含5个元素,其中三个元素是undefined: ⏱ 2020-09-08 13:54:31

4.4 属性访问表达式

📌 显然.identifier的写法更加简 ⏱ 2020-09-08 13:57:11

4.7 运算符概述

📌 运算符的副作用 ⏱ 2020-09-08 14:02:38

📌 属性访问表达式和调用表达式的优先级要比表4-1中列出的所有运算符都要高 ⏱ 2020-09-08 14:03:48

4.9 关系表达式

📌 “”和“=”运算符用于比较两个值是否相等,当然它们对相等的定义不尽相同。 ⏱ 2020-09-08 14:11:55

📌 我们只要记住“!=”称做“不相等”、“!==”称做“不严格相等”就可以了。 ⏱ 2020-09-08 14:12:16

📌 ·如果两个值都是null或者都是undefined,则它们不相等。

  • 💭 翻译错误. If both values are null or both values are undefined, they are equal. - ⏱ 2020-09-08 14:12:32

📌 为了理解instanceof运算符是如何工作的,必须首先理解“原型链”(prototypechain) ⏱ 2020-09-08 14:55:46

4.12 表达式计算

📌 下面讲解eval()的基础用法,并且介绍严格使用它的两种方法, ⏱ 2020-09-08 15:01:01

📌 eval()是一个函数,但由于它已经被当成运算符来对待了,因此将它放在本章来讲述。 ⏱ 2020-09-08 15:01:11

📌 eval()只有一个参数。如果传入的参数不是字符串,它直接返回这个参数 ⏱ 2020-09-08 15:01:26

📌 如果它调用eval(“x=1”),它会改变局部变量的值。 ⏱ 2020-09-08 15:01:50

4.13 其他运算符

📌 。由于void会忽略操作数的值,因此在操作数具有副作用的时候使用void来让程序更具语义 ⏱ 2020-09-08 15:11:48

5.3 声明语句

📌 函数声明语句通常出现在JavaScript代码的最顶层,也可以嵌套在其他函数体内。 ⏱ 2020-09-08 17:36:21

📌 和通过var声明变量一样,函数定义语句中的函数被显式地“提前”到了脚本或函数的顶部 ⏱ 2020-09-08 17:36:08

📌 和var语句一样,函数声明语句创建的变量也是无法删除的。但是这些变量不是只读的,变量值可以重写。 ⏱ 2020-09-08 18:44:58

5.5 循环

📌 for/in循环并不会遍历对象的所有属性,只有“可枚举”(enumerable)的属性才会遍历到(参照6.7节 ⏱ 2020-09-08 19:57:21

📌 ECMAScript规范并没有指定for/in循环按照何种顺序来枚举对象属性。但实际上,主流浏览器厂商的JavaScript实现是按照属性定义的先后顺序来枚举简单对象的属性,先定义的属性先枚举。 ⏱ 2020-09-08 20:25:54

5.6 跳转

📌 通过给语句定义标签,就可以在程序的任何地方通过标签名引用这条语句 ⏱ 2020-09-08 20:36:58

第6章 对象

📌 在ECMAScript 5之前,通过代码给对象创建的所有属性都是可写的、可枚举的和可配置的。 ⏱ 2020-09-08 21:23:27

6.1 创建对象

📌 new运算符创建并初始化一个新对象。关键字new后跟随一个函数调用。这里的函数称做构造函数(constructor),构造函数用以初始化一个新创建的对象 ⏱ 2020-09-08 21:29:30

📌 每一个JavaScript对象(null除外)都和另一个对象相关联。“另一个”对象就是我们熟知的原型,每一个对象都从原型继承属性。 ⏱ 2020-09-08 21:29:40

📌 因此,同使用{}创建对象一样,通过new Object()创建的对象也继承自Object.prototype。同样,通过newArray()创建的对象的原型就是Array.prototype,通过new Date()创建的对象的原型就是Date.prototype。 ⏱ 2020-09-08 21:29:57

📌 没有原型的对象为数不多,Object.prototype就是其中之一。它不继承任何属性 ⏱ 2020-09-08 21:30:12

📌 ECMAScript 5定义了一个名为Object.create()的方法,它创建一个新对象,其中第一个参数是这个对象的原型。Object.create()提供第二个可选参数,用以对对象的属性进行进一步描述 ⏱ 2020-09-08 21:33:02

6.4 检测属性

📌 in可以区分不存在的属性和存在但值为undefined的属性 ⏱ 2020-09-09 12:31:42

7.1 创建数组

📌 调用构造函数Array()是创建数组的另一种方法。 ⏱ 2020-09-09 13:34:55

7.2 数组元素的读和写

📌 清晰地区分数组的索引和对象的属性名是非常有用的。所有的索引都是属性名,但只有在0~232-2之间的整数属性名才是索引 ⏱ 2020-09-09 13:38:12

7.3 稀疏数组

📌 稀疏数组就是包含从0开始的不连续索引的数组 ⏱ 2020-09-09 13:39:34

7.8 数组方法

📌 为了按照其他方式而非字母表顺序进行数组排序,必须给sort()方法传递一个比较函数 ⏱ 2020-09-09 17:06:22

📌 假设第一个参数应该在前,比较函数应该返回一个小于0的数值。反之,假设第一个参数应该在后,函数应该返回一个大于0的数值。 ⏱ 2020-09-09 17:06:31

📌 这里使用匿名函数表达式非常方便。 ⏱ 2020-09-09 17:06:16

7.9 ECMAScript5中的数组方法

📌 然后forEach()使用三个参数调用该函数:数组元素、元素的索引和数组本身。 ⏱ 2020-09-09 17:47:01

📌 。第一个是执行化简操作的函数。化简函数的任务就是用某种方法把两个值组合或化简为一个值,并返回化简后的值。在上述例子中,函数通过加法、乘法或取最大值的方法组合两个值。第二个(可选)的参数是一个传递给函数的初始值。 ⏱ 2020-09-09 18:28:40

📌 reduceRight()的工作原理和reduce()一样,不同的是它按照数组索引从高到低(从右到左)处理数组,而不是从低到高 ⏱ 2020-09-09 18:46:15

7.12 作为数组的字符串

📌 如push()、sort()、reverse()和splice()等数组方法会修改数组,它们在字符串上是无效的。不仅如此,使用数组方法来修改字符串会导致错误:出错的时候没有提示。 ⏱ 2020-09-09 20:05:01

8.2 函数调用

📌 通过它们的call()和apply()方法间接调用 ⏱ 2020-09-09 20:15:12

📌 和变量不同,关键字this没有作用域的限制,嵌套的函数不会从调用它的函数中继承this。 ⏱ 2020-09-09 20:19:42

📌 如果嵌套函数作为函数调用,其this值不是全局对象(非严格模式下)就是undefined(严格模式下) ⏱ 2020-09-09 20:19:53

📌 凡是没有形参的构造函数调用都可以省略圆括号,比如,下面这两行代码就是等价的: ⏱ 2020-09-09 20:21:12

8.6 闭包

📌 和其他大多数现代编程语言一样,JavaScript也采用词法作用域(lexicalscoping),也就是说,函数的执行依赖于变量作用域,这个作用域是在函数定义时决定的,而不是函数调用时决定的。为了实现这种词法作用域,JavaScript函数对象的内部状态不仅包含函数的代码逻辑,还必须引用当前的作用域链 ⏱ 2020-09-09 23:02:47

📌 函数对象可以通过作用域链相互关联起来,函数体内部的变量都可以保存在函数作用域内,这种特性在计算机科学文献中称为“闭包”[插图]。 ⏱ 2020-09-09 23:05:34

📌 从技术的角度讲,所有的JavaScript函数都是闭包:它们都是对象,它们都关联到作用域链。 ⏱ 2020-09-09 23:05:47

📌 当一个函数嵌套了另外一个函数,外部函数将嵌套的函数对象作为返回值返回的时候往往会发生这种事情。有很多强大的编程技术都利用到了这类嵌套的函数闭包,以至于这种编程模式在JavaScript中非常常见 ⏱ 2020-09-09 23:06:09

📌 函数定义时的作用域链到函数执行时依然有效 ⏱ 2020-09-09 23:20:05

8.7 函数属性、方法和构造函数

📌 我们可以将call()和apply()看做是某个对象的方法,通过调用方法的形式来间接调用(见8.2.4节)函数 ⏱ 2020-09-09 23:34:26

📌 apply()方法和call()类似,但传入实参的形式和call()有所不同,它的实参都放入一个数组当中: ⏱ 2020-09-09 23:33:52

📌 传入apply()的参数数组可以是类数组对象也可以是真实数组。 ⏱ 2020-09-09 23:34:05

📌 从名字就可以看出,这个方法的主要作用就是将函数绑定至某个对象。当在函数f()上调用bind()方法并传入一个对象o作为参数,这个方法将返回一个新的函数。 ⏱ 2020-09-09 23:34:14

8.8 函数式编程

📌 JavaScript并非函数式编程语言,但在JavaScript中可以像操控对象一样操控函数,也就是说可以在JavaScript中应用函数式编程技术 ⏱ 2020-09-09 23:49:31

📌 所谓高阶函数(higher-order function)就是操作函数的函数,它接收一个或多个函数作为参数,并返回一个新函数, ⏱ 2020-09-10 13:30:02

9.2 类和构造函数

📌 例9-1展示了在JavaScript中定义类的其中一种方法。但这种方法并不常用,毕竟它没有定义构造函数,构造函数是用来初始化新创建的对象的 ⏱ 2020-09-10 13:45:54

📌 调用构造函数的一个重要特征是,构造函数的prototye属性被用做新对象的原型。这意味着通过同一个构造函数创建的所有对象都继承自一个相同的对象,因此它们都是同一个类的成员。 ⏱ 2020-09-10 13:46:03

📌 在第一段示例代码中的原型是range.methods。这种命名方式很方便同时具有很好的语义,但又过于随意。在第二段示例代码中的原型是Range.prototype,这是一个强制的命名。对Range()构造函数的调用会自动使用Range.prototype作为新Range对象的原型。 ⏱ 2020-09-10 13:38:37

11.3 解构赋值

📌 Spidermonkey 1.7实现了一种混合式赋值,我们称之为“解构赋值”(destructuringassignment) ⏱ 2020-09-10 20:16:38

第12章 服务器端JavaScript

📌 Node和Rhion常用于创建脚本服务器 ⏱ 2020-09-11 13:19:46

12.1 用Rhino脚本化Java

📌 Rhino是一种用Java编写的JavaScript解释器,其设计目标是借助于强大的Java平台API实现轻松编写JavaScript程序。 ⏱ 2020-09-11 13:20:00

第13章 Web浏览器中的JavaScript

📌 本书第一部分介绍了JavaScript语言核心。第二部分开始转向Web浏览器中JavaScript的讨论,通常称为客户端JavaScript ⏱ 2020-09-11 14:45:46

13.6 安全性

📌 浏览器厂商也在不断地权衡下面这两个方面之间的博弈:·定义强大的客户端API,启用强大的Web应用;·阻止恶意代码读取或修改数据、盗取隐私、诈骗或浪费时间。 ⏱ 2020-09-11 15:15:54

📌 防止XSS攻击是服务器端Web开发者的一项基本工作。然而,客户端JavaScript程序员也必须意识到或者能够预防跨站脚本。 ⏱ 2020-09-11 15:31:45

📌 防止XSS攻击的方式是,在使用任何不可信的数据来动态的创建文档内容之前,从中移除HTML标签。 ⏱ 2020-09-11 15:37:20

📌 HTML5的内容安全策略则更进一步,它为

14.2 浏览器定位和导航

📌 Window对象的location属性引用的是Location对象,它表示该窗口中当前显示的文档的URL,并定义了方法来使窗口载入新的文档。 ⏱ 2020-09-11 15:38:51

读书笔记

4.9 关系表达式

划线评论

📌 ·如果两个值都是null或者都是undefined,则它们不相等。 ^8292450-7kcUx9ZXr - 💭 翻译错误. If both values are null or both values are undefined, they are equal. - ⏱ 2020-09-08 14:27:08

本书评论

书评 No.1

花了五天时间粗读第一遍,重新复习了js相关的知识,以后会作为工具书使用。

⏱ 2020-09-11 16:02:18