JavaScript 高级程序设计读书笔记 第 5 章 引用类型

第 5 章 引用类型

引用类型的值(对象)是引用类型的一个实例。对象是使用 new 操作符后跟一个构造函数来创建的。构造函数本身就是一个函数。

1
var person = new Object();

JavaScript 高级程序设计读书笔记 第 4 章 变量、作用域和内存问题

第 4 章 变量、作用域和内存问题

4.1 基本类型和引用类型

ECMAScript 变量可能包含两种不同数据类型的:基本类型值和引用类型值。基本类型值指的是简单的数据段,而引用类型值指那些可能由多个值构成的对象。
在将一个值赋绐变量时,解析器必须确定这个值是基本类型值还是引用类型值。基本类型是按值访问的,引用类型是按引用访问的。

4.1.1 动态的属性

对于引用类型的值,我们可以为其添加属性和方法,也可以改变和删除其属性和方法。而我们不能给基本类型的值添加属性,尽管不会导致任何错误。

4.1.2 复制变量值

如果从一个变量向另外一个变量复制基本类型的值,会在变量对象上创建一个新值,然后把该值复制到为新变量分配得位置上。
当从一个变量向另一个变量复制引用类型的值时,同样也会将存储在变量对象中的值复制一份放到为新变量分配的空间中。不同的是,这个值的副本实际上是一个指针,而这个指针指向存储在堆中的一个对象。复制操作结束后,两个变量实际上将引用同一个对象。

4.1.3 传递参数

ECMAScript 中所有函数的参数都是按值传递的。把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。在向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量。所以局部变量的变化会反映在外部。

4.1.4 检测类型

检测一个变量是不是基本数据类型,可以使用 typeof,如果想知道某个值是什么类型的对象,可以使用 instanceof 操作符。
如果变量是给定引用类型的实例,那么 instanceof 操作符会返回 true 。

4.2 执行环境及作用域

每一个执行环境都有与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中。
全局执行环境是最外围的一个执行环境,根据 ECMA 所在的宿主环境不同,执行环境对象也不一样。浏览器中,全局执行环境被认为是 window 对象。
每个函数都有自己的执行环境,当执行流进入一个函数时,函数环境就会被推入环境栈中。函数执行后,栈将其环境退出。把控制器交还给之前的执行环境。
当代码在环境中执行,会创建变量对象的一个作用域链。作用域链的用处是保证对执行环境有权访问的所有变量和函数的有序访问。作用域链的前端,永远都是当前执行代码所在环境的变量对象
如果这个环境是函数,则将其活动对象作为变量对象。活动对象在最开始时只包含一个变量,即 arguments 对象,作用域链中的下一个变量对象来自包含(外部)环境,而再下一个变量对象则来自下一个包含环境。这样,一直延续到全局执行环境。全局执行环境的变量对象始终都是作用域链中的最后一个对象。

内部环境可以通过作用域链访问所有的外部环境,但是外部环境不能访问内部环境中的任何变量和函数。每个环节都可以向上搜索作用域链,以查询变量和函数名。

4.2.1 延长作用域链

With 不常用,略。
4.2.2 var 没有块级作用域

1
2
3
4
if (true) {
var color = "blue";
}
console.log(color); //blue

使用 var 声明的变量会添加到最接近的环境中

1
2
3
4
for (var i = 0; i < 10; i++) {
//doSomething
}
console.log(i); //10

如果在循环中创建变量,在循环结束后依旧会存在于循环的外部执行环境中。

  1. 声明变量
    使用 var 声明的变量会添加到最接近的环境中,如果初始化变量时候没有声明,则会被添加到全局环境(严格模式会报错)。
  2. 查询标识符
    当环境中为了读取或写入而引入一个标识符时,会从作用域链的前端开始,向上逐级查询与给定名字匹配的标识符。如果在局部环境找到该标识符,搜索结果停止。一直追溯到全局环境的变量对象。

4.3 垃圾收集 GC

4.3.1 标记清除

4.3.2 引用计数

4.4 小结

JavaScript 变量可以保存两种类型的值,基本类型和引用类型。基本类型和引用类型有以下特点。

  • 基本类型在内存中占据固定大小的空间,因此被保存在栈内存中;
  • 从一个变量向另一个变量复制基本类型的值,会创建这个值的副本;
  • 引用类型的值是对象,保存在堆内存中;
  • 包含引用类型值的变量实际上包含的并不是对象本身,而是一个指向该对象的指针;
  • 从一个变量向另一个变量复制引用类型的值,复制的其实是指针,因此两个变量最终都指向同一个对象;
  • 确定一个值是哪种基木类型可以使用 typeof 操作符,而确定一个值是哪种引用类型可以使用 instanceof 操作符。

所有变量(包括基本类型和引用类型)都存在于一个执行环境(也称为作用域)当中,这个执行环境决定了变量的生命周期,以及哪一部分代码可以访问其中的变量。以下是关于执行环境的几点总结

  • 执行环境有全局执行环境(也称为全局环境)和函数执行环境之分;
  • 每次进入一个新执行环境,都会创建一个用于搜索变量和函数的作用域链;
  • 函数的局部环境不仅有权访问函数作用域中的变量,而且有权访问其包含(父)环境,乃至全局环境;
  • 全局环境只能访问在全局环境中定义的变量和函数,而不能直接访问局部环境中的任何数据;
  • 变量的执行环境有助于确定应该何时释放内存。
    Javascript 是一门具有自动垃圾收集机制的编程语言,开发人员不必关心内存分配和回收问题。可以对 JavaScript 的垃圾收集例程作如下总结。
  • 离开作用域的值将被自动标记为可以回收,因此将在垃圾收集期间被删除。
  • “标记清除”是目前主流的垃圾收集算法,这种算法的思想是给当前不使用的值加上标记,然后再回收其内存。
  • 另一种垃圾收集算法是“引用计数”,这种算法的思想是跟踪记录所有值被引用的次数。 JavaScript 引擎目前都不再使用这种算法;但在 IE 中访问非原生 JavaScript 对象(如 DOM 元素)时,这种算法仍然可能会导致问题。
  • 当代码中存在循环引用现象时,“引用计数”算法就会导致问题。
  • 解除变量的引用不仅有助于消除循环引用现象,而且对垃圾收集也有好处。为了确保有效地回收内存,应该及时解除不再使用的全局对象、全局对象属性以及循环引用变量的引用。

JavaScript 高级程序设计读书笔记 第 3 章 基本概念

第 3 章 基本概念

3.1 语法

3.1.1 区分大小写

ECMAScript 中的一切都区分大小写。

3.1.2 标识符

所谓标识符,就是指变量、函数、属性的名字,或者函数的参数。标识符可以是按照下列格式规则组合起来的一或多个字符:

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

3.4 数据类型

ECMAScript 有六种基本类型 Undifined Null Boolean Number String SymbolObject

3.4.1 typeof 操作符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
// Numbers
typeof 37 === "number";
typeof 3.14 === "number";
typeof Math.LN2 === "number";
typeof Infinity === "number";
typeof NaN === "number"; // 尽管NaN是"Not-A-Number"的缩写
typeof Number(1) === "number"; // 但不要使用这种形式!

// Strings
typeof "" === "string";
typeof "bla" === "string";
typeof typeof 1 === "string"; // typeof总是返回一个字符串
typeof String("abc") === "string"; // 但不要使用这种形式!

// Booleans
typeof true === "boolean";
typeof false === "boolean";
typeof Boolean(true) === "boolean"; // 但不要使用这种形式!

// Symbols
typeof Symbol() === "symbol";
typeof Symbol("foo") === "symbol";
typeof Symbol.iterator === "symbol";

// Undefined
typeof undefined === "undefined";
typeof declaredButUndefinedVariable === "undefined";
typeof undeclaredVariable === "undefined";

// Objects
typeof { a: 1 } === "object";

// 使用Array.isArray 或者 Object.prototype.toString.call
// 区分数组,普通对象
typeof [1, 2, 4] === "object";

typeof new Date() === "object";

// 下面的容易令人迷惑,不要使用!
typeof new Boolean(true) === "object";
typeof new Number(1) === "object";
typeof new String("abc") === "object";

// 函数
typeof function() {} === "function";
typeof class C {} === "function";
typeof Math.sin === "function";
typeof new Function() === "function";

注意

1
typeof null === "object";

3.4.5 Number 类型

1.精度

浮点数值的最高精度是 17 位小数,但在进行算术计算时其精确度远远不如整数。例如,0.1 加 0.2 的结果不是 0.3。

2.范围

ECMAScript 正数数值范围最大为 Number.MAX_VALUE 最小的数值为 Number.Min_VALUE,如果超出最大值,则会转换为 Infinity。
判断一个数字是否是有穷的,可以通过 isFinite()函数来判断。

3.NaN

NaN,即非数值(Not a Number)是一个特殊的数值,这个数值用于表示一个本来要返回数值的操 作数未返回数值的情况(这样就不会抛出错误了)。
注意

1
NaN === NaN) === false;

判断 NaN 需要通过 isNaN 函数。
如果基于对象调用 isNaN ,会先使用 valueOf ,然后返回的值是否能转换为数值,如果不能,再调用 toString() 方法。

4.数值转换

有三个函数可以把非数值转换为数值,Number(),parseInt(),parseFloat
Number 的转换规则如下

  • 如果是 Boolean,true 和 false 讲分别转换为 1 和 0
  • 如果是数值,则是简单的传入和返回
  • 如果是 null 返回 0
  • 如果是 undefined 返回 NAN
  • 如果是字符串,遵循下列规则 + 如果字符串中只包含数字(包括前面带正号或负号的情况),则将其转换为十进制数值,即 1 会变成 1,"123"会变成 123,而"011"会变成 11 + 如果字符串中包含有效的浮点格式,如 1.1,则将其转换为对应的浮点数值 + 如果字符串中包含有效的十六进制格式,例如"0xf",则将其转换为相同大小的十进制整数值; + 如果字符串是空的(不包含任何字符),则将其转换为 0 + 如果字符串中包含除上述格式之外的字符,则将其转换为 NaN + 如果是对象,则调用对象的 valueof()方法,然后依照前面的规则转换返回的值。如果转换的结果是 NaN,则调用对象的 tostring()方法,然后再次依照前面的规则转换返回的字符串值。

一元加操作符(3.5.1节将介绍)的操作与 number() 函数相同。

parseInt()在转换字符串时,更多的是看其是否符合数值模式。它会忽略字
符串前面的空格,直至找到第一个非空格字符。如果第一个字符不是数字字符或者负号, parseInt()就会返回 NaN;也就是说, parseInt('') //NaN

  • 如果第一个字符是数字字符, parseInt()会继续解析第二个字符,直到解析完所有后续字符或者遇到了一个非数字字符。

parseInt 的第二个参数为转换使用的进制,建议无论在任何情况都要穿入第二个参数。

parseFloat 也是从第一个字符(位置 0)开始解析每个字符。而且也是一直解析到字符串末尾, 或者解析到遇见一个无效的浮点数字字符为止。符串中的第一个小数点是有效的,而第二个小数点就是无效的了。

parseFloat() 只解析十进制的数字,如果字符串包含的是个可解析为整数的数,parseFloat 结果会是一个整数。

3.4.6 String 类型

String 类型用于表示由零或多个 16 位 Unicode 字符组成的字符序列,即字符串。字符串可以由单引号(')或双引号")表示。

1
"\u03a3".length === 1; //true
  1. 字符串的特点
    ECMAScript 中的字符串是不可变的。一旦创建,它们的值就不能改变。要改变变量创建的字符串,首先要销毁原来的字符串。
  2. 转换为字符串
    要把值转换为字符串,有两种方式。第一种是使用几乎每个值都有的 toString 方法。多数情况下,调用 tostring 方法不必传递参数。但是,在调用数值的 tostring()方法时,可以传递一个参数:输出数值的基数。默认情况下,基数为 10。
1
2
var num = 10;
console.log(num.toString(8)); // "12"

如果不确定值是否为 null 或者 undefined 可以使用函数 String 来转换。

1
2
String(null); // "null"
String(undefined); // "undefined"

3.4.7 Object 类型

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

3.5 操作符

3.5.1 一元操作符

  1. 递增和递减操作符 ++,--
1
2
3
4
let a = 1;
console.log(++a); //2
console.log(a++); //2
console.log(a); //3
  1. 一元加和减操作符
    加放在数值面前,对数值不会产生任何影响,如果是对非数值应用一元加操作符,会先把这个值转换成数值。

3.5.2 位运算

  • ~
  • &
  • |
  • 异或 ^
  • 左移 <<
  • 有符号右移 >>
  • 无符号右移 >>>

3.5.3 布尔操作符

  1. 逻辑非 !
    可以把任何数据类型都转换为布尔值。
1
2
3
4
5
![]; //false
!{}; //false
!123; //false
!0; //true
!NaN; //true

可以同时使用两个 !,结果与 Boolean 函数相同

  1. 逻辑与&&
    除了用在布尔值上,也可以用在对象上。
  • 如果第一个操作数是对象,则返回第二个操作数;
  • 如果第二个操作数是对象,则只有在第一个操作数的求值结果为 true 的情况下才会返回该对象;
  • 如果两个操作数都是对象,则返回第二个操作数;
  • 如果有一个操作数是 null,则返回 null;
  • 如果有一个操作数是 NaN,则返回 NaN;
  • 如果有一个操作数是 undefined , 则返回 undefined
  1. 逻辑或 ||
    同上,也可以用在对象上。
  • 如果第一个操作数是对象,则返回第一个操作数;
  • 如果第一个操作数的求值结果为 false,则返回第二个操作数;
  • 如果两个操作数都是对象,则返回第一个操作数;
  • 如果两个操作数都是 null,则返回 null;
  • 如果两个操作数都是 NaN,则返回 NaN;
  • 如果两个操作数都是 undefined,则返回 undefined

3.5.4 乘性操作符

* /

3.5.5 加性操作符

+ -

3.5.6 关系操作符

< > <= >=

  • 如果两个操作数都是数值,则执行数值比较。
  • 如果两个操作数都是字符串,则比较两个字符串对应的字符编码值。
  • 如果一个操作数是数值,则将另一个操作数转换为一个数值,然后执行数值比较。
  • 如果一个操作数是对象,则调用这个对象的 valueOf 方法,用得到的结果按照前面的规则执行比较。如果对象没有 valueOf 方法,则调用 toString 方法,并用得到的结果根据前面的规则执行比较。
  • 如果一个操作数是布尔值,则先将其转换为数值,然后再执行比较。

因为大写字符的字符编码全部小于小写字母的字符编码,所以就会看到如下的现象。

1
2
3
var result = "Brick" < "alphabet"; //true
var result = "23" < "3"; //true;
var result = "23 " < 3; // false

3.5.7 相等操作符

== === != !==

  1. 相等和不相等
    如果两个操作数不相等,会执行强制转型,再比较相等性
  • 如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值 fase 转换为 0,而 true 转换为 1;
  • 如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值;
  • 如果一个操作数是对象,另一个操作数不是,则调用对象的 valueOf()方法,用得到的基本类型值进行比较。
1
2
null == undefined; //true
NaN != NaN; //true
  1. 全等和不全等
    如果类型不相等,则返回 false

3.5.8 条件操作符 ?:

1
variable = boolean_expression ? true_value : false_value;

3.5.9 赋值操作符 =

在等号前面加乘性操作符、加性操作符或位操作符,可以完成复合操作。

1
2
3
4
5
var num = 10;
num = num + 10;
//等价于下面的
var num = 10;
num += 10;

3.5.10 逗号操作符

逗号操作符可以在一行语句中执行多个操作.

1
2
var num = 1,
num2 = 2;

3.6 语句

3.6.1 if 语句

推荐任何时候都用代码块包起来。

3.6.2 do-while 语句

3.6.3 while 语句

3.6.4 for 语句

1
2
3
for (;;) {
console.log(1);
} // 无限循环

3.5.5 for-in 语句

用来枚举对象的属性,或者枚举数组的索引

3.6.6 label 语句

略 几乎不使用

3.6.7 break 和 continue 语句

3.6.8 with 语句

3.6.9 switch 语句

不要忘记加 break

3.7 函数

通过 return 来表示返回值,函数会在 return 之后立刻退出,任何 return 后的语句都不会执行。finally 除外。

1
2
3
4
5
6
7
8
9
function tt() {
try {
return 2;
} catch {
} finally {
return 1;
}
}
tt(); // 1

如果 return 后不带任何返回值,则相当于返回 undefined 。

推荐的做法是要么让函数始终都返回一个值,要么永远都不要返回值。否则,如果函教有时候返回值,有时候有不返回值,会给调试代码带来不便。

3.7.1 理解参数

函数内可以通过 arguments 来访问参数,arguments 不是 Array 的实例,虽然有 length 来表示参数的个数。但是没有 Array 的一些方法。

3.7.2 没有重载

定于两个名字相同的函数,则名字属于后定义的函数,可以通过检查传入参数的类型和数量,模拟重载。

3.8 小结

JavaScript 的核心语言特性在 ECMA-262 中是以名为 ECMAScrip t 的伪语言的形式来定义的。ECMAScript 中包含了所有基本的语法、操作符、数据类型以及完成基本的计算任务所必需的对象,但没有对取得输入和产生输出的机制作出规定。理解 ECMAScript 及其纷繁复杂的各种细节,是理解其在 Web 浏览器中的实现 ————JavaScript 的关键。

  • ECMAScript 中的基本数据类型包括 Undefined、Null、 Boolean、Number、String 和 Symbol
  • 与其他语言不同, ECMScript 没有为整数和浮点数值分别定义不同的数据类型, Number 类型可用于表示所有数值。
  • ECMAScript 中也有一种复杂的数据类型,即 Object 类型,该类型是这门语言中所有对象的基础类型。
  • 严格模式为这门语言中容易出错的地方施加了限制。
  • ECMAScript 提供了很多与 C 及其他类 C 语言中相同的基本操作符,包括算术操作符、布尔操作符、关系操作符、相等操作符及赋值操作符等。
  • ECMAScript 从其他语言中借鉴了很多流控制语句,例如 if 语句、for 语句和 switch 语句等。
    ECMAScript 中的函数与其他语言中的函数有诸多不同之处。
  • 无须指定函数的返回值,因为任何 ECMAScript 函数都可以在任何时候返回任何值。
  • 实际上,未指定返回值的函数返回的是一个特殊的 undefined 值。
  • ECMAScript 中也没有函数签名的概念,因为其函数参数是以一个包含零或多个值的数组的形式传递的。
  • 可以向 ECMAScript 函数传递任意数量的参数,并且可以通过 arguments 对象来访向这些参数。
  • 由于不存在函数签名的特性, ECMAScript 函数不能重载。

JavaScript 高级程序设计读书笔记 第 2 章 在HTML中使用 JavaScript

第 2 章 在 HTML 中使用 JavaScript

2.1 <script> 元素

在页面插入 JavaScript 主要方法,就是使用 <script> 元素。 <script> 常用有下面几个属性:

  • async(html5) 该布尔属性指示浏览器是否在允许的情况下异步执行该脚本。该属性对于内联脚本无作用 (即没有 src 属性的脚本)。
  • defer 这个布尔属性被设定用来通知浏览器该脚本将在文档完成解析后,触发 DOMContentLoaded 事件前执行。如果缺少 src 属性(即内嵌脚本),该属性不应被使用,因为这种情况下它不起作用。对动态嵌入的脚本使用 async=false 来达到类似的效果。
  • src 这个属性定义引用外部脚本的 URI,这可以用来代替直接在文档中嵌入脚本。指定了 src 属性的 script 元素标签内不应该再有嵌入的脚本
  • type 该属性定义 script 元素包含或 src 引用的脚本语言。属性的值为 MIME 类型; 支持的 MIME 类型包括text/javascript, text/ecmascript, application/javascript, 和application/ecmascript。如果没有定义这个属性,脚本会被视作 JavaScript。如果 type 属性为 module,代码会被当作 JavaScript 模块 。请参见 ES6 In Depth: Modules

代码出现 </script> 会导致错误。

1
2
3
4
5
<script type="text/javascript*>
function sayScript (){
alert("</script>")
}
</script>

因为按照解析嵌入式代码的规则,当浏览器遇到字符串</script>时,就会认为那是结束的 <script>标签。可以通过把这个字符串分隔为两部分可以解决这个问题。

1
2
3
4
5
<script type="text/javascript*>
function sayScript (){
alert("<\/script>")
}
</script>

无论如何包含代码,只要不存在 defer 和 async 属性,浏览器都会按照<script>元素在页面中 出现的先后顺序对它们依次进行解析。换句话说,在第一个 <script>元素包含的代码解析完成后,第 二个 <script>包含的代码才会被解析,然后才是第三个、第四个…..

2.1.1 标签的位置

如果把 <script> 标签放在 <head> 中,则必须等全部的 JavaScript 代码执行完成以后,才能呈现页面的内容。此时浏览器窗口将是一片空白。所以现代应用程序一般把 JavaScript 引用放在 <body> 元素中页面内容的后面。如下显示:

1
2
3
4
5
6
7
8
9
10
<!DOCTYPE html>
<html lang="en">
<head>
<title>Document</title>
</head>
<body>
<!-- 这里放内容 -->
<script src="example1.js"></script>
</body>
</html>

2.1.2 延迟脚本 defer

如果 <script> 标签添加了 defer 属性,那么脚本会延迟到整个页面都解析完毕再运行。相当于告诉浏览器立刻下载,但是延迟执行。

1
2
<script defer="defer" src="example1.js">
<script defer="defer" src="example2.js">

在上面的例子中,脚本将延迟到浏览器遇到 </html> 标签后再按照它们出现的顺序依次执行。这两个脚本会先于 DOMContentLoaded 事件触发前执行。
注意 defer 只适用于外部脚本。

2.1.3 异步脚本

HTML5 之中为 <script> 元素定义了 async 属性。和 defer 属性类似,async 同样只适用于外部脚本。但是和 defer 不同的是标记为 async 的脚本不保证先后顺序执行。
就拿下面的例子来说,脚本 2 可能在脚本 1 之前执行。

1
2
<script async src="example1.js">
<script async src="example2.js">

异步脚本一定会在页面的 load 事件之前执行,但是可能在 DOMContentLoaded 事件触发之前或触发之后执行。

2.4 <noscript> 元素

包含在< noscript>元素中的内容只有在下列情况下才会显示出来

  • 浏览器不支持脚本;
  • 浏览器支持脚本,但脚本被禁用。
1
2
3
4
5
6
7
8
9
10
11
<!DOCTYPE html>
<html lang="en">
<head>
<title>Document</title>
</head>
<body>
<noscript>
<p>本页面需要浏览器支持(启用) JavaScript</p>
</noscript>
</body>
</html>

就像上面那个例子。这个页面会在脚本无效的情况下向用户展示一条消息。

2.5 小结

把 JavaScript 插入到 HTML 页面中要使用 <script> 元素。使用这个元素可以把 JavaScript 嵌入到 HTML 页面中,让脚本与标记混合在一起;也可以包含外部的 JavaScript 文件。而我们需要注意的地方有:

  • 在包含外部 JavaScript 文件时,必须将 src 属性设置为指向相应文件的 URL。而这个文件既可 以是与包含它的页面位于同一个服务器上的文件,也可以是其他任何域中的文件。
  • 所有 <script> 元素都会按照它们在页面中出现的先后顺序依次被解析。在不使用 defer 和 async 属性的情况下,只有在解析完前面 <script>元素中的代码之后,才会开始解析后面 <script> 元素中的代码
  • 由于浏览器会先解析完不使用 defer 属性的 <script>元素中的代码,然后再解析后面的内容, 所以一般应该把 <script> 元素放在页面最后,即主要内容后面,</body>标签前面。
  • 使用 defer 属性可以让脚本在文档完全呈现之后再执行延迟脚本总是按照指定它们的顺序执行。
  • 使用 async 属性可以表示当前脚本不必等待其他脚本,也不必阻塞文档呈现。不能保证异步脚本按照它们在页面中出现的顺序执行。
    另外,使用< noscrip>元素可以指定在不支持脚本的浏览器中显示的替代内容。但在启用了脚本的情况下,浏览器不会显示< noscript>元素中的任何内容。

JavaScript 高级程序设计读书笔记 第 1 章 JavaScript 简介

第 1 章 JavaScript 简介

完整的 Javascript 实现应该由三部分组成 ECMAScript DOM BOM

1.2.1 ECMAScript

ECMAScript 和浏览器没有依赖关系,浏览器只是 ECMAScript 可能的宿主环境之一。宿主环境不仅提供基本的 ECMAScript 实现,同时也会提供该语言的扩展,以便语言与环境之间对接交互。而这些扩展——如 DOM,则利用 ECMAScript 的核心类型和语法提供更多具体功能。
ECMAScript 则大致规定了这门语言的下列组成部分。

  • 语法
  • 类型
  • 语句
  • 关键字
  • 保留字
  • 操作符
  • 对象

1.2.2 文档对象模型 (DOM)

1.2.2 文档对象模型(DOM)
文档对象模型(DOM, Document Object Model )是针对 XML 但经过扩展用于 HTML 的 API。
利用 DOM API,开发人员就可以轻松自如地删除、添加、替换或修改任何节点。

1.2.3 浏览器对象模型(BOM)

BOM 是支持访问和操作浏览器窗口的浏览器对象模型(BOM, Browser Object Model) 的 API,开发人员使用 BOM 可以控制浏览器显示的页面以外的部分。但人们习惯上也把所有针对浏览器的 JavaScript 扩展算作 BOM 的一部分。

1.3 JavaScript 版本

不同的浏览器支持不同的 JavaScript,有一些高级的 API 就无法在古老的浏览器中使用。

1.4 小结

JavaScript 是一种专为与网页交互而设计的脚本语言,由下列三个不同的部分组成

  • ECMAScript,由 ECMA-262 定义,提供核心语言功能;
  • 文档对象模型(DOM),提供访问和操作网页内容的方法和接口;
  • 浏览器对象模型(BOM),提供与浏览器交互的方法和接口。
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×