《JavaScript高级程序设计》读书笔记(一)

2019-05-18  本文已影响0人  番薯雪糕

《JavaScript高级程序设计》第三版第二次阅读的读书笔记

第一章——JavaScript简介:

  1. 一个完整JavaScript实现应该包含下面三个部分组成:
  1. ECMA-262标准
  1. ECMAScript

第二章——在HTML中使用JavaScript:

  1. HTML5规范要求脚本按照它们出现的顺序执行,但在现实中,延迟脚本并不一定会按照顺序执行,也不一定会在DOMContentLoaded事件触发前执行。
  2. 异步脚本不保证按照指定它们的先后顺序执行,因此,要确保两者之间互不依赖。
  3. 建议异步脚本不要在加载期间修改DOM
  4. 异步脚本一定会在页面的load事件前执行,但可能会在DOMContentLoaded事件触发之前或之后执行。
  5. 文档模式

第三章——基本概念:

  1. 标识符,指的是变量、函数、属性的名字,或者函数的参数。
  2. 严格模式
  1. 语句结尾的分号如果不写,容易导致压缩错误
  2. 变量
  1. 数据类型
  1. 操作符
// 前置递减,变量的值是在语句被求值以前改变的
var num1 = 2;
var num2 = 10;
var num3 = --num1 + num2;
var num4 = num1 + num2;
// num3的值是 11
// num4的值是11

// 后置递减,递减的操作是在包含它们的语句被求值之后才执行的
var num1 = 2;
var num2 = 10;
var num3 = num1-- + num2;
var num4 = num1 + num2;
// num3的值是 12
// num4的值是11
// 乘法
NaN * 1 = NaN;
Infinity * 0 = NaN;
Infinity * -10 = -Infinity;
Infinity * Infinity = Infinity;
// 除法
Infinity / Infinity = NaN;
Infinity / -1 = -Infinity;
0 / 0 = NaN;
100 / 0 = Infinity;
// 要比较相等性之前,不能将null和undefined转换成其他任何值
null == 0; // false;
undefined == 0; // false
  1. 语句
  1. 函数

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

  1. 将一个值赋值给变量时,解析器必需确定这个值是基本类型值还是引用类型值
  2. 基本类型值在内存中占据固定大小的空间,因此被保存在栈内存中;引用类型的值是对象,保存在堆内存中
  3. 所以引用类型的值都是object的实例
  4. 确定一个值是哪种基本类型可以使用typeof操作符,而确定一个值是哪种引用类型可以使用instanceof操作符
  5. 每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存到这个对象中
  6. 作用域链的用途,是保证对执行环境有权访问的所有变量和函数的有序访问
  7. 函数参数也被当作变量来对待,因此其访问规则与执行环境中的其他变量相同
  8. 延长作用域链(有些语句可以在作用域链前端添加一个变量对象)
  1. 没有块级作用域;使用var声明的变量会自动被添加到最接近的环境中,在with语句中,最接近的环境是函数环境
  2. 垃圾收集(标记清除)
  1. 垃圾收集(引用计数)
  1. 分配给Web浏览器的可用内存数量通常要比分配给桌面应用程序的少
  2. 确保占用最少的内存可以让页面获得更好的性能,因此一旦数据不再有用,最好通过将其设置为null来释放其引用

第五章——引用类型:

  1. 引用类型是一种数据结构,用于将数据和功能组织在一起(它也常被称为类,但这种称呼并不妥当),引用类型有时候也被称为对象定义,因为它们描述但是一类对象所具有的属性和方法。
  2. 构造函数本身就是一个函数,只不过该函数是出于创建新对象的目的而定义的。
  3. 创建object实例的方法
  1. 对象字面量的数值属性名会自动转换为字符串
  2. Array类型
  1. Date类型
  1. RegExp类型
  1. Function类型
// 函数声明
function sum (num1, num2) {
  return num1 + num2;
}
// 函数表达式
var sum = function (num1, num2) {
  return num1 + num2;
};
// Function构造函数
var sum = new Function("num1", "num2", "return num1 + num2");
  1. 基本包装类型
// (1)创建String类型的一个实例
// (2)在实例上调用指定的方法
// (3)销毁这个实例
// 可以想象成这样的代码
var s1 = new String("some text");
var s2 = s1.substring(2);
s1 = null;
// 从而让我们实现下面这种直观的操作
var s1 = "some text";
var s2 = s2.substring(2);
类型名称 valueOf()返回 toString()返回
Boolean类型 基本类型值true或false 字符串"true"或"false"
Number类型 对象表示的基本类型的数值 字符串形式的数值
String类型 对象所表示的基本字符串值 对象所表示的基本字符串值
  1. 单体内置对象

第六章——面向对象的程序设计:

  1. 面向对象(Object-Oriented, OO)
  2. 属性类型:
  1. 创建对象(工厂模式、构造函数模式、原型模式、组合使用构造函数模式和原型模式、寄生构造函数模式、稳妥构造函数模式)
  1. 继承(原型链、借用构造函数、组合继承、原型式继承、寄生式继承、寄生组合式继承)
function object(o){
    function F(){}
    F.prototype = o;
    return new F();
}

第七章——函数表达式:

  1. 函数声明提升是指在执行代码之前会先读取函数声明
  2. 匿名函数也叫拉姆达函数
  3. 递归函数是在一个函数通过名字调用自身的情况下构成的
  4. arguments.callee
var factorial = (function f(num){
    if(num <= 1){
        return 1;
    } else {
        return num * f(num - 1);
    }
});
  1. 闭包
  1. this对象是在运行时基于函数的执行环境绑定的
  2. 每个函数在被调用时都会自动取得两个特殊变量,thisarguments,内部函数在搜索这两个变量时,只会搜索到其活动对象为止,因此永远不可能直接访问外部函数中的这两个变量
  3. 把外部作用域中的this对象保存在一个闭包能够访问到的变量里,就可以让闭包访问该对象(arguments也要这样操作,才能访问到外部的)
  4. this的值可能会意外地改变,即使是语法的细微变化,都有可能意外改变this的值
  5. 内存泄漏:如果闭包的作用域链中保存着一个HTML元素,那么就意外着该元素将无法被销毁
  6. 匿名函数可以用来模仿块级作用域并避免这个问题,块级作用域(通常称为私有作用域)
  7. 将函数声明包含在一对圆括号中,表示它实际是一个函数表达式
  8. 无论在什么地方,只要临时需要一些变量,就可以使用私有作用域
  9. 用匿名函数立即执行,实现私有作用域这种做法,经常在全局作用域中被用在函数外部,从而限制向全局作用域中添加过多的变量和函数
  10. 可以使用构造函数模式、原型模式来实现自定义类型的特权方法,也可以使用模块模式、增强的模块模式来实现单例的特权方法
  11. 私有变量
  1. 静态私有变量
  1. 模块模式
  1. 增强的模块模式:适合那些单例必须是某种类型的实例,同时还必须添加某些属性和方法对其加以增强的情况

第十一章——DOM扩展:

  1. 选择符API
  1. 元素遍历,因为不同有的浏览器会返回文本节点,有的不会,为了确保遍历的是元素,且行为一致,因此新定义了下面的一些属性
  1. HTML5
  1. 专有扩展
<meta http-equiv="X-UA-Compatible" content="IE=IEVersion">
div. innerText = div. innerText;
上一篇 下一篇

猜你喜欢

热点阅读