JS权威指南读书笔记(三)
第七章 数组
1 数组的实现是经过优化的,用数字索引来访问数组元素一般来说比访问常规的对象属性要快的多。
2 数组直接量的语法允许有可选的结尾的逗号,故[ ; ; ]只有两个元素而非三个。
3 调用构造函数创建数组
a 调用时没有参数 => 空数组
b 调用时有一个数值参数 => 指定长度的数组
c 显式指定两个或多个数组元素或一个非数值元素 => 参数成为新数组的元素
4 稀疏数组:包含从0开始的不连续索引(即 '索引值' in '数组' 运算返回 false)的数组。可以用Array构造函数或简单地指定数组的索引值大于当前的数组长度或用delete运算符来创建稀疏数组。
5 数组元素的添加和删除
a 为新索引赋值
b push unshift(头尾插入)
c pop shift(头尾删除)
d splice(startIndex, deleteCount, insertItems...) 插入、删除或替换
6 数组常用方法(红色标注方法会改变原数组结构):
a join() 将数组中所有元素都转化为字符串并连接在一起,返回最后生成的字符串;
b reverse() 将数组中的元素颠倒顺序;
c sort() 将数组中的元素排序并返回排序后的数组;
d concat() 创建并返回一个新数组;
e slice() 返回指定数组的一个片段或子数组;
f splice() 在数组中插入或删除元素;
g push() unshift() pop() shift() 注意,当使用多个参数调用unshift()时,参数是一次性插入的(类似splice方法);
7 ES5数组方法(第一个参数接收一个函数,对数组的每个元素调用一次该函数,如果是稀疏数组,对不存在的元素不调用传递的函数):
forEach() map()
filter() 注意:filter会跳过稀疏数组缺少的元素,它的返回数组总是稠密的;
every() some() 注意:在空数组上调用时,every返回true,some返回false;
reduce() reduceRight() 注意:在空数组上,不带初始值参数调用reduce将导致类型错误异常;
indexOf() lastIndexOf() 搜索整个数组中具有给定值的元素,返回找到的第一个元素的索引或者如果没有找到返回-1
8 Array.isArray() 或者 Object.prototype.toString.call()
9 一种常常完全合理的看法把拥有一个数值length属性和对应非负整数属性的对象看做一种类型的数组。
第八章 函数
1 以表达式方式定义的函数。函数的名称的可选的,一条函数声明语句实际上声明了一个变量,并把一个函数对象赋值给它。如果一个函数定义表达式包含名称,函数的局部作用域会包含一个绑定到函数对象的名称。实际上,函数的名称将成为函数内部的一个局部变量。
2 函数调用的方式
a 函数调用
b 方法调用
c 构造函数调用
d call() 和 apply() 间接调用
3 函数调用的调用上下文在非严格模式下,是全局对象,在严格模式下,是undefined。这种模式的区分经常看到,比如call或者apply的第一个参数。定义并调用一个函数来确定当前脚本运行时是否为严格模式
var strict = function () { return !this; }
4 关键字this没有作用域的限制,嵌套的函数不会从调用它的函数中继承this。如果嵌套函数作为方法调用,其this的值指向调用它的对象;如果嵌套函数作为函数调用,其this值不是全局对象就是undefined。
5 凡是没有形参的构造函数调用都可以省略圆括号。
6 如果构造函数使用return语句,没有返回值,或者返回一个原始值,那么将忽略返回值,同时使用这个新对象作为调用结果。
7 ECMA规定,arguments对象callee属性指代当前正在执行的函数,caller是非标准的,指代调用当前正在执行的函数的函数。
8 函数的执行依赖于变量作用域,这个作用域是在函数定义时决定的,而不是函数调用时决定的。这解释了,函数返回,属性中包含多个函数的对象,共享同一个作用域链。
9 在函数体内,arguments.length表示传入函数的实参的个数;而函数本身的length属性代表函数形参的数量。
10 传入apply() 的参数数组可以是类数组对象也可以是真实数组。
11 真正的bind() 方法返回一个函数对象,它的length属性是绑定函数的形参个数减去绑定实参的个数。
12 Function构造函数,最后一个实参所表示的文本就是函数体。函数体的代码编译总是会在顶层函数执行。
第九章 类和模块
1 原型对象是类的唯一标识:当且仅当两个对象继承自同一个原型对象时,它们台式属于同一个类的实例。两个不同的构造函数,可能它们的原型prototype指向同一个对象,那么它们所创造的实例是属于同一个类的。
2 instanceof 不会检查实例是否有构造函数初始化而来,而是检查实例是否继承自构造函数的原型prototype。
3 鸭式辩形:不要关注 对象的类是什么,而是关注 对象能做什么。
4 一般来讲,模块是一个独立的JS文件。模块文件可以包含一个类定义、一组相关的类、一个实用的函数库或者一些待执行的代码。