0%

《JavaScript高级程序设计 第三版》读书笔记 - 第一至三章

  • JavaScript简介
  • 在HTML中使用JavaScript
  • 基本概念

第1章 JavaScript简介

JavaScript实现

一个完整的JavaScript实现由三部分组成:

  • 核心(ECMAScript)
  • 文档对象模型(DOM)
  • 浏览器对象模型(BOM)

第2章 在HTML中使用JavaScript

<script>元素

<script>的属性:

  • async,立即下载脚本,但是不妨碍页面中的其他操作。只对外部脚本文件有效。异步脚本不一定按照顺序执行。
  • charset,字符集
  • defer,脚本可以延迟到文档完全被解析和显示之后再执行。只对外部脚本文件有效。延迟脚本会按照顺序执行。
  • src,表示包含要执行代码的外部文件
  • type,表示编写代码使用的脚本语言的内容类型(也称为 MIME 类型)。

默认浏览器会按照<script>元素出现的先后顺序依次解析

<noscript>元素

当浏览器不支持脚本或者脚本被禁用时,显示<noscript>中的内容

第3章 基本概念

语法

标识符规则:

  • 第一个字符必须是字母、下划线或美元符号
  • 其他字母可以是字母、下划线、美元符号或数字

"use strict"启用严格模式

变量

变量可以保存任何类型的数据

使用var定义变量

省略var会自动创建一个全局变量,严格模式下会抛出ReferenceError错误

数据类型

UndefinedNullBooleanNumberStringObject

对一个值实行typeof操作符可能返回如下某个字符串

  • "undefined"
  • "boolean"
  • "string"
  • "number"
  • "object"
  • "function"

Undefined类型只有undefined值,在使用var声明变量但未初始化时,变量的值是undefined

而对未声明的变量执行typeof操作符同样也会返回undefined值。

Null类型只有null值,表示一个空对象指针,null == undefinedtrue

Boolean类型有truefalse字面值

数据类型 转换为true的值 转换为false的值
String 任何非空字符串 空字符串
Number 任何非零数字值 0和NaN
Object 任何对象 null
Undefined N/A undefined

浮点数值如果是整数,就会被自动转化成整数

能够保存的最小数值保存在Number.MIN_VALUE中,最大数值保存在Number.MAX_VALUE中,如果超过范围,会被转换成-Infinity或者Infinity

使用isFinite()函数判断是否是有限的值

NaN即非数值,任何涉及NaN的操作都会返回NaNNaN和任何值不相等,使用isNaN()函数判断是否是NaN

使用Number()函数将别的变量类型转换为数值类型

  • 如果是null值,返回 0。
  • 如果是undefined,返回NaN
  • 如果是对象,则调用对象的valueOf()方法,然后依照前面的规则转换返回的值。如果转换的结果是NaN,则调用对象的toString()方法,然后再次依照前面的规则转换返回的字符串值。

parseInt()函数将字符串转换为整数,可以指定第二个参数为基数

parseFloat()函数将字符串转换为浮点数,只能转换为十进制

通过length属性取得字符串的长度

通过其他值的toString()方法来将其他类型转换为字符串,如果是数字类型,可以指定一个参数表示基数,nullundefined类型没有这个方法

使用String()函数来转化为字符串,如果是null或者undefined类型的话则会返回类型名字符串

对象可以通过执行new操作符后跟要创建的对象类型的名称来创建。

操作符

对非数值应用++--或一元+ -时,转换成数值再做运算

NaNInfinity应用位操作,这两个值会被当做0来处理

对非数值应用位操作,会转换成数值再做运算

无符号右移>>>,会把负数的二进制当成原码来右移

逻辑与操作不一定返回布尔值:

  • 如果第一个操作数是对象,则返回第二个操作数;
  • 如果第二个操作数是对象, 则只有在第一个操作数的求值结果为true的情况下才会返回该对象;
  • 如果两个操作数都是对象,则返回第二个操作数;
  • 如果有一个操作数是null,则返回null
  • 如果有一个操作数是NaN,则返回NaN
  • 如果有一个操作数是undefined,则返回undefined

逻辑或类似:

  • 如果第一个操作数是对象,则返回第一个操作数;
  • 如果第一个操作数的求值结果为false,则返回第二个操作数;
  • 如果两个操作数都是对象,则返回第一个操作数;
  • 如果两个操作数都是null,则返回null
  • 如果两个操作数都是NaN,则返回NaN
  • 如果两个操作数都是undefined,则返回undefined

避免为变量赋nullundefined

1
var myObject = preferredObject || backupObject;

乘法操作符的规则:

  • 如果操作数都是数值,执行常规的乘法计算。如果乘积超过了ECMAScript数值的表示范围,则返回Infinity-Infinity
  • 如果有一个操作数是NaN,则结果是NaN
  • 如果是Infinity与0相乘,则结果是NaN
  • 如果是Infinity与非0数值相乘,则结果是Infinity-Infinity,取决于有符号操作数的符号;
  • 如果是InfinityInfinity相乘,则结果是Infinity
  • 如果有一个操作数不是数值, 则在后台调用Number()将其转换为数值, 然后再应用上面的规则。

除法操作符的特殊规则:

  • 如果是InfinityInfinity除,则结果是NaN
  • 如果是零被零除,则结果是NaN
  • 如果是非零的有限数被零除,则结果是Infinity-Infinity,取决于有符号操作数的符号;
  • 如果是Infinity被任何非零数值除,则结果是Infinity-Infinity,取决于有符号操作数的符号;

求模操作符的特殊规则:

  • 如果被除数是无穷大值而除数是有限大的数值,则结果是NaN
  • 如果被除数是有限大的数值而除数是零,则结果是NaN
  • 如果是InfinityInfinity除,则结果是NaN
  • 如果被除数是有限大的数值而除数是无穷大的数值,则结果是被除数;
  • 如果被除数是零,则结果是零;

加法运算符的规则:

如果两个操作符都是数值,执行常规的加法计算,然后根据下列规则返回结果:

  • 如果有一个操作数是NaN,则结果是NaN
  • 如果是InfinityInfinity,则结果是Infinity
  • 如果是-Infinity-Infinity,则结果是-Infinity
  • 如果是Infinity-Infinity,则结果是NaN
  • 如果是+0加+0,则结果是+0;
  • 如果是-0加-0,则结果是-0;
  • 如果是+0加-0,则结果是+0。

不过,如果有一个操作数是字符串,那么就要应用如下规则:

  • 如果两个操作数都是字符串,则将第二个操作数与第一个操作数拼接起来;
  • 如果只有一个操作数是字符串, 则将另一个操作数转换为字符串, 然后再将两个字符串拼接起来。

如果有一个操作数是对象、数值或布尔值,则调用它们的toString()方法取得相应的字符串值,然后再应用前面关于字符串的规则。对于undefinednull,则分别调用String()函数并取得字串"undefined""null"

减法运算符的规则:

  • 如果两个操作符都是数值,则执行常规的算术减法操作并返回结果;
  • 如果有一个操作数是NaN,则结果是NaN
  • 如果是InfinityInfinity,则结果是NaN
  • 如果是-Infinity-Infinity,则结果是NaN
  • 如果是Infinity-Infinity,则结果是Infinity
  • 如果是-InfinityInfinity,则结果是-Infinity
  • 如果是+0减+0,则结果是+0;
  • 如果是+0 减-0,则结果是-0;
  • 如果是-0减-0,则结果是+0;
  • 如果有一个操作数是字符串、布尔值、nullundefined,则先在后台调用Number()函数将其转换为数值,然后再根据前面的规则执行减法计算。如果转换的结果是NaN,则减法的结果就是NaN
  • 如果有一个操作数是对象,则调用对象的valueOf()方法以取得表示该对象的数值。如果得到的值是NaN,则减法的结果就是NaN。如果对象没有valueOf()方法,则调用其toString()方法并将得到的字符串转换为数值。

关系运算符规则:

如果一个操作数是数值,则将另一个操作数转换为一个数值,然后执行数值比较。任何操作数与NaN进行 关系比较,结果都是false

相等运算符特殊规则:

  • 如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值;
  • 如果有一个操作数是NaN,则相等操作符返回false,而不相等操作符返回true
  • 如果两个操作数都是对象,则比较它们是不是同一个对象。

全等运算符(===)和不全等(!==)运算符:

比较之前不进行类型转换,null === undefinedfalse

语句

for-in语句:用来枚举对象的属性

1
for (property in expression) statement

label语句:在代码中添加标签

1
label: statement

breakcontinue可以与label结合使用

with语句的作用是将代码的作用域设置到一个特定的对象中。

1
with (expression) statement;

用于简化多次编写同一个对象的操作。在with语句的代码块内部, 每个变量首先被认为是一个局部变量, 而如果在局部环境中找不到该变量的定义, 就会查询对象中是否有同名的属性。如果发现了同名属性,则以对象属性的值作为变量的值。

可以在switch语句中使用任何数据类型,每个case值不一定是常量,也可以是变量和表达式。

switch在比较时使用全等操作符,不会发生类型转换。

函数

1
2
3
function functionName(arg0, arg1,..., argN) {
statements
}

return;返回undefined

ECMAScript中的参数在内部是用一个数组来表示的。函数接收到的始终都是这个数组,而不关心数组中包含哪些参数(如果有参数的话)。

在函数体内可以通过arguments对象来访问这个参数数组,从而获取传递给函数的每一个参数。

通过访问arguments对象的length属性可以获知有多少个参数传递给了函数。

arguments中的值永远与对应命名参数的值保持同步。

没有传递值的命名参数将自动被赋予undefined值。

如果在ECMAScript中定义了两个名字相同的函数,则该名字只属于后定义的函数。