JavaScript高级程序设计总结

第1章 JavaScript简介

part 1 JavaScript基本概念

包括定义,组成部分,基本特点,日常用途,历史,特性,编程,版本,与其他语言的比较参考).

part 2 组成部分

  • ECMAScript,由ECMA-262定义,提供JavaScript核心功能。
  • DOM(DOM级别),提供访问和操作网页内容的方法和接口。
  • BOM(5个对象)(JS高程第八章),提供与浏览器交互的方法和接口。

第二章 在HTML中使用JavaScript

主要注意点:

  • <script>的六个属性是什么以及各自的用途?
  • 延迟脚本&异步脚本各自的特点?
  • 标签可以放在哪些位置?
  • 当嵌入代码和外部文件同时存在于一个<script>标签里,会发生什么?
  • 多个<script>存在于页面中时,它们的解析顺序?(注意延迟脚本和异步脚本的存在)
  • 外部文件相对于嵌入代码有什么好处?
  • 文档模式&doctype?(混杂模式,标准模式,准标准模式,严格模式……)
  • <noscript>标签解决了怎样的问题?

第三章 基本概念

part 1 基本语法

  • 区分大小写
  • 标识符是什么?标识符命名规则?
  • 严格模式用在哪?怎么启用?有哪些特点?
  • 关键字和保留字的区别?关键字和保留字分别有哪些?

part2 变量

  • 变量仅仅是一个用于保存值的占位符,变量可以用来保存任何值,未经初始化的变量的值为undefined
  • var、let、const的区别?

part 3 数据类型

  • 基本数据类型有哪些,它们各自有哪些特点?

  • typeof操作符有什么作用,它有哪些特点?

  • 检测变量数据类型有哪些方法?

  • 包含undefined值的变量和尚未定义的变量的区别?

  • undefinednull的区别?

  • 关于Boolean()函数转化(哪些转换为true,哪些转换为false

  • JavaScript是如何储存数值的?为什么会出现 0.1+0.2 != 0.3 的情况? 参考

  • 数值范围以及isFinite()函数

  • NaN是什么,isNaN()函数

  • 数值转换函数Number(),parseInt(),parseFloat()各自特点以及它们之间的区别?

  • 转义序列是用来干嘛的?有哪些?

  • 字符串又什么特点?(ECMAScript中的字符串是不可变的,也就是说,字符串一旦创建,它们的值就不能改变。要改变某个变量保存的字符串,首先要销毁原来的字符串,然后再用另外一个包含新值的字符串填充该变量)

  • 转换为字符串方法toString(),String()的区别

  • Object类型所具有的的任何属性和方法同样存在于更具体的对象中。Object的每个实例都有这些属性和方法(constructorhasOwnProperty(propertyName)isPrototypeOf(object)propertyIsEnumerable(propertyName)toLocaleString()toString()valueOf()

  • toLocaleString()toString()valueOf()各自的功能以及它们的区别?

part 4 操作符

  • ++、–、+、- 对非数值应用时,会像Number()转型函数一样对这个值执行转换。
  • 位操作(& | ~ ^ << >>)的基本概念
  • 左移位不会影响操作数的符号位;有符号右移,空位由符号位填充;无符号右移,空位由0填充。
  • 布尔操作符(&& || !)基本操作。
  • 逻辑非会先把它的操作数强转为一个布尔值,然后再求反。逻辑与,逻辑或在有一个操作数不是布尔值的情况下,不一定返回布尔值,它们的规则是?(p45、p46)
  • 关系操作符(>, < ,<=, >=…)的操作数使用了非数值时,要进行数据转换或完成某些操作,规则是怎样的?(p50)
  • 相等和不相等——先转换再比较;全等和不全等——仅比较而不转换。相等和不相等操作符对操作数进行强制转型的规则是什么?(p51)

part 5 语句

  • if语句、do-while语句、while语句、for语句、for-in语句label语句、break和continue语句、with语句、switch语句

  • for-in语句是一种精准的迭代语句,可以用来枚举对像的属性。语法:for (property in expression) statement。ECMAScript对象的属性没有顺序,因此,通过for-in循环输出的属性名的顺序是不可预测的。但是,如果表示要迭代的对象的变量值为null或undefined,for-in语句会抛出错误。

  • label语句可以在代码中添加标签,以便将来使用。语法:label: statement

  • break和continue语句都可以和label语句联合使用,从而返回代码中特定的位置。例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    var num = 0;
    outermost:
    for(var i = 0; i < 10; i++){
    for(var j = 0; j < 10; j++){
    if(i==5 && j==5){
    break outermost;//①添加这个标签的结果导致break语句不仅会退出内部的for语句,而且与会退出外部的for语句。
    //continue outermost; //退出内部循环,执行外部循环
    }
    num++;
    }
    }
    conslole.log(num); //①55 ②95

part 6 函数

  • return 语句可以不带有任何返回值。在这种情况下,函数停止执行后将返回undefined值。这种用法一般用在需要提前停止函数执行而又不需要返回值的情况下。
  • ECMAScript中的参数在内部都是用一个数组来表示的。函数接收到的始终是这个数组,而不关心数组中包含哪些参数。函数体内的argument对象可以访问这个参数数组,从而获取传递给函数的每一个参数。
  • 命名的参数只提供便利,但不是必需的。ECMAScript中也没有函数签名的概念,因为其函数参数是一个包含0个或多个值的数组的形式传递的。
  • argument对象可以与命名参数一起使用。argument对象的值永远与对应命名参数的值保持同步。虽然值保持同步,但它们的内存空间是独立的。
  • 没有传递值的命名参数自动被赋予undefined值。
  • 由于不存在函数签名的特性,ECMAScript函数不能重载。

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

part 1 引用类型和基本类型的值

  • 引用类型、基本类型是什么?它们有哪些异同?
  • 定义基本类型和引用类型的值的方式是类似的:创建一个变量并为该变量赋值。但对于引用类型的值,我们可以为其添加属性和方法,也可以改变和删除其属性和方法。
  • 复制:①基本类型:两者是完全独立的,相当于创建了一个副本。②引用类型:副本实际是一个指针,指针指向存储在堆中的一个对象。复制结束后,两者实际引用同一个对象。
  • 传递参数:所有函数的参数都是按值传递的!

part 2 执行环境和作用域

  • 执行环境、作用域、作用域链这些是什么?
  • 怎么延长作用域链?
  • 关于没有块级作用域怎么理解?
  • 作用域的类型有哪些?

part 3 垃圾收集

  • 为什么需要进行垃圾收集?
  • 垃圾收集的方式有哪些以及它们的原理?(标记清除&引用计数)
  • 当代码中存在循环引用现象时,“引用计数”算法就会导致问题,问题是什么?如何解决?
  • 解除引用是什么?它有哪些好处?

第五章 引用类型

  • 引用类型是什么?引用类型的值(对象)是什么?

part 1 Array类型

数组的每一项都可以保存任何类型的数据。数组的大小是可以动态调整的,即可以随着数据的添加自动增长以容纳新增数组。

  • 创建数组的方式:

    1
    2
    3
    4
    5
    6
    7
    //使用Array()构造函数
    var a = new Array();
    var a = new Array(20);
    var a = new Array("red","blue","black");
    var a = Array(3);//在使用Array构造函数时也可以省略new操作符
    //使用字面量表示法【与对象一样,在使用数组字面量表示法时,也不会调用Array构造函数。
    var a = ["red", "blue", "black"];
  • 检测数组的方法有哪些?

  • 数组有哪些方法?(转换方法、栈方法、队列方法、重排序方法、操作方法<创建、切片、删除、插入、替换>、位置方法、迭代方法、归并方法)

  • sort()方法需要注意的问题。sort()方法接受的比较函数是怎样的?实现的原理是什么?

  • splice()方法如何实现删除、插入、替换操作?

  • every()、some()、map()、filter()、forEach()的区别?

  • 归并数组方法reduce()和reduceRight()是怎么操作的?

part 2 Date类型

Date类型使用UTC(国际协调时间)1970年1月1日零时开始经过的毫秒数来保存日期。

  • 创建日期对象var now = new Date(); //自动获取当前时间和日期

  • 如果想根据特定时间和日期创建日起对象。必须穿入该日期的毫秒数,Date.parse(), Date.UTC()可简化这个过程。两个方法接收的参数有一定的规则。

  • 例:

1
2
3
var someDay = new Date(Date.parse("May 25, 2004"));
var someDay = new Date("May 25, 2004");//后台自动调用Date.parse()方法
var someDay = new Date(Date.UTC(2000,0,1,0,55,55));
  • Date.now()方法,返回表示调用这个方法的日期和时间的毫秒数。使用+操作符也可获取Date对象的时间戳。

    1
    2
    3
    4
    5
    6
    var start = Date.now();
    //var start = +new Date();
    doSomething();
    var stop = Date.now();
    //var stop = +new Date();
    result = stop-start;
  • Date类型继承的toString()、toLocaleStirng、valueOf()方法的区别?

  • 日期格式化有哪些方法?

  • 日期/时间组件的方法有哪些?

    part 3 RegExp类型

    part 4 Function类型

函数实际上是对象,每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法。由于函数是对象,因此函数名实际上是一个指向函数对象的指针。使用不带圆括号的函数名是访问函数指针,而非调用函数!

函数名本身就是变量,所以函数也可以通过作为值来使用。也就是说,不仅可以像传递参数一样把一个函数传递给另一个函数,而且可以将一个函数作为另一个函数的结果返回。

  • 理解函数为什么没有重载?
  • 函数提升是什么?
  • 函数内部的两个特殊对象:argument和this分别是什么?
  • argument对象的callee属性有什么用?(callee属性是一个指针,指向拥有这个argument对象的函数。)
  • 函数的另一个对象属性caller是什么?它有什么用?(caller属性保存着调用当前函数的函数的引用,如果是在全局作用域中调用当前函数,它的值为null)。
  • 函数是对象,因此函数也有属性和方法。每个函数都包含两个属性:length和prototype。length属性标识函数希望接收的命名参数的个数。
  • 对于EMCAScript引用类型而言,prototype是保存它们所有实例和方法的真正所在。换句话说,诸如toString(),valueOf()等方法实际上都保存在prototype名下,只不过是通过各自对象的实例访问罢了。prototype属性是不可枚举的,因此使用for-in无法发现。
  • 每个函数都包含两个非继承而来的方法:apply()和call()。它们的用途是什么?它们两个的区别是什么?它们的适用情况?
  • bind()方法是什么?

part 5 基本包装类型

为了便于操作基本类型值,ECMAScript还提供了3个特殊的引用类型:Boolean,Number和String。这些类型和其他引用类型相似,但同时也有各自的基本类型相应的特殊行为。实际上,每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型的对象。

引用类型和基本包装类型的主要区别就是对象的生存期。使用new操作符创建的引用类型的实例,在执行流离开当前作用域之前都一直保存在内存中。而自动创建的基本包装类型的对象,则只存在于一行代码的执行瞬间,然后立即被销毁。这意味着我们不能在运行时为基本类型值添加属性和方法。

Object构造函数会根据传入值的类型返回相应基本包装类型的实例。把字符串传给Object构造函数,就会创建String的实例;传入数值参数会得到Number的实例;传入布尔值参数就会得到Boolean的实例。

注意:使用new调用基本包装类型的构造函数,与直接调用同名的转型函数是不一样的。

1
2
3
4
5
6
var a = "25";
var b = Number(a);//转型函数
console.log(typeof b);//"number"

var c = new Number(a);//构造函数
console.log(typeof c);//"object"

Boolean类型

  • 创建Boolean对象:var a = new Boolean(ture)
  • Boolean类型改写了toString()、valueOf()方法
  • 布尔表达式中所有对象都会被转换为true

Number类型

  • 重写后的valueOf方法返回对象表示的基本类型的数值
  • 创建:var a = new Nubmer(10);
  • toString() toFixed() toExponential() toPrecision()方法

String类型

  • 创建:var s = new String("Hello world");
  • 方法: 字符方法、字符串操作方法、字符串位置方法、trim()方法、字符串大小写转换方法、字符串模式匹配方法、localeCompare()方法、fromCharCode()方法

part 6 单体内置对象

内置对象的定义:由ECMAScript实现提供的、不依赖于宿主环境的对象,这些对象在ECMAScript程序执行之前就已经存在了。

Global对象

不属于任何其他对象的属性和方法,最终都是它的属性和方法。事实上,没有全局变量或全局函数;所有在全局作用域中定义的属性和函数,都是Global对象的属性。

  • URI编码方法
  • eval()方法
  • Global对象的属性
  • window对象

Math对象

  • Math对象的属性有哪些?
  • min()和max()方法
  • 舍入方法
  • random()方法
  • 其他方法