阅读大块头《javascript 权威指南》笔记 10-正则表达式的模式匹配

  • 在正则表达式创建的 RegExp 对象中,ECMAscript5 的标准中,实例是独立的。

  • 用 反斜线 \ 作为转义非字母的特殊字符。

  • ^ 符号定义否定字符,例如 /[^abc]/ 匹配 a b c 之外的所有字符。

  • | 表示可选字符, 例如 /ab|cd|ef/ 匹配 ab 或者 cd 或者 ef,顺序为从左到右。

  • /[a-z]/ 匹配小写字母, /[a-zA-Z0-9]/ 匹配任何字母和数字。

  • search() 的参数如果不是正则表达式,会自动转换为正则表达式。

  • split() 方法的参数也可以是一个正则表达式。

  • [...] 匹配方括号内的任意字符

  • [^...] 不在方括号内的任意字符。

  • . 除换行符和其他 Unicode 航终止符之外的任意字符。

  • \w 任何 ASCII 字符的单词,等同 [a-zA-Z0-9]

  • \W 任何不是 ASCII 字符的单词,同上相反.

  • \s 任意 Unicode 空白符。

  • \S 任意非 Unicode 空白符的字符,但和 \w 不同。

  • \d 任何 ASCII 数字,等同 [0-9]

  • \D 除了 ASCII 数字外的任意字符。

  • {n,m} 匹配前一项至少 n 次,但是不超过 m 次。

  • {n,} 匹配前一项 n 次或者更多。

  • {n} 匹配前一项 n 次

  • ? 匹配前一项 0 次或者 1 次,等同 {0,1}

  • + 匹配 1 次或者多次,等同 {1,}

  • * 匹配前一项 0 次或者多次,等同 {0,}

  • (...) 组合,将几个项组成为一个单元

  • (?:...) 仅组合,但不记忆和改组相匹配的字符

  • ^ 匹配开头

  • $ 匹配结尾

  • (?=P) 零宽正向先行断言,要求接下来的字符都与 p 匹配,但是不包括匹配 p 的字符。

  • (?!p) 零宽负向先行断言,要求接下来的字符不与 p 匹配。

阅读大块头《javascript 权威指南》笔记 9-类和模块

  • 在 javascript 中,类的实现是基于原型继承机制的。

  • 如果两个实例都从同一个原型对象上继承了属性,我们称之为同一个类的实例。

  • 使用 instanceof 运算符来检测对象是否属于某个类,例如 r instanceof Range,返回布尔值。

  • 实际上 instanceof 不会检测 r 是否由 Range() 构造函数初始化而来,而会检查 r 是否继承自 Range.prototype,这也说明了构造函数是类的共有标示的概念。

  • 基于原型的继承机制是动态的,也就是说如果修改了原型,会影响到所有继承这个原型的实例对象,当然也意味着可以通过给原型添加新方法来扩充 javascript 类。

  • 通过 isPrototypeOf() 可以检测对象的原型链上是否存在某个原型对象。 range.methods.isPrototypeOf(r); ,返回布尔值。

  • 但是 instanceofisPrototypeOf 的缺点是无法通过对象来获得类名,只能检测对象是否属于指定的类名,在客户端 javascript 中有个严重的不足,就是在多窗口和多框架中,每个都居中单独的执行上下文,每个上下文都包含独有的全局变量和构造函数,所以例如来自两个框架的 Array() 返回的结果是 false的。

  • nullundefined 没有构造函数。

  • constructor 可以 类名来判断是否来自同一个构造函数。

今天把自己给坑了,在大型项目中,你能看出来坑在哪里吗?

以下情况,#demo1 永远不会变色,知道为什么吗?

这个把我坑惨了,在复杂的构造函数中很难找出原因,也说明了基础很重要,哦不,实战更重要。

coffee版

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Test1
constructor: (el) ->
@el = el
@set1()
@set2()

set1: ->
p = """<p>这是一个测试</p>"""
document.body.innerHTML += p

set2: ->
@el.style.background = 'blue'

demo1 = new Test1 document.querySelector('#demo1')

更多

阅读大块头《javascript 权威指南》笔记 8-函数

  • 函数只定义一次,但可能被执行或调用多次。

  • 形参:函数中定义的变量。

  • 实参:函数中参入的参数对象。

  • 每次调用还会拥有另外一个值,本次调用的上下文,也就是 this 关键字的值。

  • 如果函数挂载在一个对象上,作为对象的一个属性,这个就称为对象的方法,当通过这个对象来调用函数时,对象就是此次的上下文。

  • 用于初始化一个新创建的对象的函数称为 构造函数(constructor)。

  • 在 javascript 中,函数也是一个对象,例如可以把函数赋值给变量,或者作为参数传入其他函数。

  • 函数可以嵌套在其他函数中定义,这样它们可以访问它们被定义时所处的作用域中的任何变量,这意味着 javascript 函数构成了一个闭包(closure)。

  • 函数命名尽量于动词为开头。

  • 函数定义时不会执行,只有调用时才会执行,有 4 种调用方式。 1. 作为函数 2. 作为方法 3. 作为构造函数 4. 通过它们的 call() 和 apply() 方法间接调用。

  • 实参对象定义了 callee 和 caller 属性。
    _ callee 指代当前正在执行的函数。
    _ caller 是非标准的,但大多数浏览器都实现了这个属性,指代的是当前正在执行的函数的函数。 * 在 ECMA5 严格模式中,对这两个属性的读写会产生一个类型错误。

阅读大块头《javascript 权威指南》笔记 7-数组

  • 数组是之的有序集合。

  • 每个值叫做一个元素,每个元素在数组中都有一个位置,用数字表示,也就是索引。

  • 数组是无类型的,数组的元素可以试任意类型,并且同一个数组中的不同元素也可能是不同的类型。

  • 数组的元素可能是对象或者其他数组,例如对象的数组和数组内的数组。

  • 数组最大能容纳 4294967295 个元素。
    数组是动态的,根据需要它们会增长或者缩减,创建时也无需声明一个固定的大小,变化时也无需重新分配空间。
    数组可以是稀疏的,也就是说索引不一定要连续,它们之间可以由空缺。
    每个数组都有一个 length 属性,非稀疏数组,length 就是对应的个数,稀疏数组,lenbgth 比所有元素的索引要大。
    var a = []; a[1000] = 0; // a.length = 1001

  • 如果省略某个值,省略的元素会被赋予 undefined 值。
    var count = [1, , 3]; // [1, undefined, 3]

  • 设置 length 属性为一个小于当前长度的非负数整数 n 时,大于或者等于 n 的元素会被删除。
    var a = [1,2,3,4,5]; a.length = 3; // a = [1,2,3]

  • ES5 中,可以通过 Object.defineProperty()让数组变为自读。
    var a = [1,2,3]; Object.defineProperty(a, 'length', {writable: false}); a.length = 1000; // a.length = 3;

  • 使用 push() 在数组末尾增加一个或者多个元素.

  • 可以像删除对象属性一样用 delete 运算符删除数组元素,并赋予 undefined,并且 length 不变。

阅读大块头《javascript 权威指南》笔记 6-对象

  • 所有通过对象字面量创建的对象都具有同一个原型对象,可以通过 Object.prototype 获得对象的引用。
  • 对象具有 ‘自有属性’,也有一些属性从原型对象继承而来,例如查询对象 o 的属性 x,如果 o 中没有 x,那么会继续在 o 的原型中查询 x,如果这个原型也有原型,则一样处理,直到查到 null 为止。
  • 如果属性不存在,不会报错,会返回 undefined。
  • delete 运算符只是断开属性和宿主对象的联系,而不能删除继承属性(非要删除的话,得遍历删除)。
    1
    2
    3
    var a = {x:1};
    var b = a.x;
    delete a.x; // a = {} b = {x:1}

-

Object.create()

  • 创建一个新对象,第一个参数是这个对象的原型。
  • 第一个参数传入 null,则创建一个没有原型的对象,这种方式创建的对象不会继承任何东西,甚至不包括基础方法,例如 toString(),也就是说不能和 ‘+’ 运算符一起工作。

阅读大块头《javascript 权威指南》笔记 5-语句

  • 如果说表达式在 javascript 中是短语,那么语句就是 javascript 中的整句或者命令。
  • 语句是以分号结束的。
  • var 和 function 都是声明语句,分别是定义变量和函数。
  • 如果 var 语句中变量没有指定初始化表达式,那么这个变量的值为 undefined
  • break 是跳转到循环或者其他语句的结束。
  • continue 是停止本次循环并执行下一次循环。
  • return 可以让解释器挑出函数体的执行,并提供本次调用的返回值。
  • 在严格模式中禁止用 with 语句。
  • 严格模式中所有变量必须先声明。
  • 严格模式中调用的函数中的 this 值是 undefined 而不是全局对象,可以用这个特性来判断是否严格模式。