学习笔记:《JavaScript高级程序设计》

第1章 JavaScript简介

1.一个完整的JavaScript实现应该由三部分组成:核心(ECMAScript),文档对象模型(DOM)和浏览器对象模型(BOM)。

2.Web浏览器只是ECMAScript实现可能的宿主环境之一。宿主环境不仅提供基本的ECMAScript实现,同时也会提供该语言的扩展,以便语言与环境之间对接交互。而这些扩展——如DOM,则利用ECMAScript的核心类型和语法提供更多更具体的功能,以便实现针对环境的操作。其他宿主环境包括Node(一种服务端JavaScript平台)。

3.DOM也是应用编程接口(API)。

 

第2章 在HTML中使用JavaScript

1.带有src属性的<script>元素不应该在其<script>和</script>标签之间再包含额外的JavaScript代码。

 

第3章 基本概念

1.如果在函数中使用var定义一个变量,那么这个变量在函数推出后就会被销毁。

2.虽然省略var操作符可以定义全局变量,但这不是我们推荐的做法。

3.ECMAScript中有5种简单数据类型(也成为基本数据类型):Undefined、Null、Boolean、Number和String。还有1种复杂数据类型——Object,Object本质上是由一组无序的名值对组成的。Object类型不等于对象。ECMAScript中对象其实就是一组数据和功能的集合。

4.包含undefined值的变量与尚未定义的变量还是不一样的。对于后者,只能执行一项操作,即用typeof操作符检测其数据类型。

5.只要意在保存对象的变量还没有真正保存对象,就应该明确地让该变量保存null值。

6.永远不要测试某个特定的浮点数值(即像这样:a + b === 0.3)。

7.parseInt():不指定基数意味着让parseInt()决定如何解析输入的字符串,因此为了避免错误的解析,我们建议无论在什么情况下都明确指定基数。

8.按位非操作的本质:操作数的负值减1。虽然用一元减操作符和加法操作符也能实现同样的效果,但由于按位非是在数值表示的最底层执行操作,因此速度更快。

9.我们可以利用逻辑或的短路行为来为变量赋值提供后备值,以避免为变量赋null或undefined值。

10.忽视加法操作中的数据类型是ECMAScript编程中最常见的一个错误(比如用字符串和数值相加,数值会先被转换成字符串)。

11.如有有一个操作数是NaN,则相等操作符返回false。即使两个操作数都是NaN,相等操作符也返回false;因为按照规则,NaN不等于NaN。

12.由于相等和不相等操作符存在类型转换问题,而为了保持代码中数据类型的完整性,我们推荐使用全等和不全等操作符。

13.我们建议如果使用label语句,一定要使用描述性的标签,同时不要嵌套过多的循环。

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

15.ECMAScript函数有一个重要特点:命名的参数只提供便利,但不是必需的。

16.通过访问arguments对象的length属性可以获知有多少个参数传递给了函数。开发人员可以利用这一点让函数能够接收任意个参数并分别实现适当的功能。虽然这个特性算不上完美的重载,但也足够弥补ECMAScript的这一缺憾了。

17.函数:没有传递值的命名参数将自动被赋予undefined值。这就跟定义了变量但又没有初始化一样。

18.ECMAScript中的所有参数传递的都是值,不可能通过引用传递参数。

 

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

1.当从一个变量向另一个变量复制引用类型的值时,和复制基本类型的值一样,也会将存储在变量对象中的值复制一份放到为新变量分配的空间中。不同的是,这个值的副本实际上是一个指针,两个变量实际上将引用同一个对象。即基本类型的值是按值访问的,引用类型的值是按引用访问的。

2.ECMAScript中所有函数的参数都是按值传递的。

3.执行环境(execution context,有时也称为“环境”或“作用域”)是JavaScript中最为重要的一个概念。执行环境的类型总共只有两种——全局和局部(函数)。

4.JavaScript没有块级作用域。在其他类C的语言中,由花括号封闭的代码块都有自己的作用域(用ECMAScript的话来讲,就是它们自己的执行环境)。

5.确保占用最少的内存可以让页面获得更好的性能。而优化内存占用的最佳方式,就是为执行中的代码只保存必要的数据。一旦数据不再有用,最好通过将其值设置为null来释放其引用——这个做法叫做解除引用(dereferencing)。这一做法适用于大多数全局变量和全局对象的属性。局部变量会在它们离开执行环境时自动被解除引用。

 

 

第5章 引用类型

1.引用类型的值(对象)是引用类型的一个实例。在ECMAScript中,引用类型是一种数据结构,用于将数据和功能组织在一起。它也常被称为类,但这种称呼并不妥当。

2.对象字面量是向函数传递大量可选参数的首选方式。一般来讲,命名参数虽然容易处理,但在有多个可选参数的情况下就会显得不够灵活。最好的做法是对那些必需值使用命名参数,而使用对象字面量来封装多个可选参数。

3.通常,除非必须使用变量来访问对象的属性,否则我们建议使用点表示法而不是方括号表示法。

4.使用不带圆括号的函数名是访问函数指针,而非调用函数。

5.this引用的是函数执行的环境对象。在调用函数之前,this的值并不确定。

6.一定要牢记,函数的名字仅仅是一个包含指针的变量而已。

7.对于ECMAScript中的引用类型而言,prototype属性是保存它们所有实例方法的真正所在。换句话说,注入toString()和valueOf()等方法实际上都保存在prototype名下,只不过是通过各自对象的实例访问罢了。

8.每个函数继承的toLocaleString()和toString()方法始终都返回函数的代码(在调试代码时很有用)。

9.基本类型值不是对象(引用类型值才是),因而从逻辑上讲它们不应该有方法,但从表面上看它们确实有方法。实际上,每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型(特殊的引用类型,包括Boolean、Number和String),从而让我们能够调用一些方法来操作这些数据。

10.静态方法:只能被构造函数本身调用,而不能被实例调用。实例方法反之。

11.Global(全局)对象可以说是ECMAScript中最特别的一个对象了,因为不管你从什么角度上看,这个对象都是不存在的。ECMAScript中的Global对象在某种意义上是作为一个终极的“兜底儿对象”来定义的。换句话说,不属于任何其他对象的属性和方法,最终都是它的属性和方法。事实上,没有全局变量或全局函数;所有在全局作用域中定义的属性和函数,都是Global对象的属性。ECMAScript虽然没有指出如何直接访问Global对象,但Web浏览器都是将这个全局对象作为window对象的一部分加以实现的。因此,在全局作用域中声明的所有变量和函数,就都成为了window对象的属性和方法。JavaScript中的window对象除了扮演ECMAScript规定的Global对象的角色外,还承担了很多别的任务。以下代码是取得Global对象的另一种方法(末尾有一对括号表示是一个立即调用的函数表达式)。

var global = function() {

  return this;

} ();

12.Math.random()方法返回大于等于0小于1的一个随机数。套用下面的公式,就可以利用Math.random()从某个整数范围内随机选择一个值。

值 = Math.floor(Math.random() * 可能的值的总数 + 第一个可能的值)

13.函数实际上是对象。每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法。由于函数是对象,因此函数名实际上是一个指向函数对象的指针。

14.函数通常是使用函数声明语法定义的,这与使用函数表达式定义函数的方式相差无几,最后一种定义函数的方式是使用Function构造函数(从技术的角度讲,这也是函数表达式)。

posted @ 2018-06-22 00:05  刘胡粤  阅读(231)  评论(0编辑  收藏  举报