Javascript笔记

  • 所有变量都是传引用,没有传值的

  • 数字的内部表示都为double,所以1和1.0是相同的值

  • 被当做false的值:null, undefined, ’’, 0, NaN

  • null,undefined不是对象;布尔,数字,字符串类似对象;其他都是对象,即可变的键值对集合

  • typeof检测的类型:‘boolean’, ‘number’, ‘string’, ‘undefined’, ’function‘, ‘object’

  • key:value对中的key是合法标识符时(仅含数字字母下划线)可以不加引号

  • 引用对象属性时可以用.[],若属性名不是合法标识符则只能用[]

  • hasOwnProperty()查对象属性时不查prototype链,delete可删除对象属性

  • 只有函数会创建作用域,花括号代码块不创建作用域

  • ||可提供默认值:var middle = stooge["middle-name"] || "(none)"

  • 除了声明时定义的形式参数,函数还接受两个附加的参数:thisargumentsthis值取于四种模式之一:

    1. 当函数作为对象的属性时,this指向该对象
    2. 当函数不是对象的属性时,this指向全局对象。这设计错误导致内部函数的this指向了全局对象,而不是外部函数的this。解决方法是在外部函数中定义var that = this;,然后在内部函数中通过that来访问。
    3. new Func()创建新对象时,this指向该对象
    4. func.apply(that, arguments)调用函数时,this指向传进的that

    arguments可访问函数被调用时欲传进的实参列表,包括那些没有形参对应的多余参数。arguments类似数组,有length属性可下标访问,但设计错误使它没成为数组。吧arguments变成数组,使用var args = Array.prototype.slice.apply(arguments)

  • 函数总会返回一个值,没有指定返回值时返回undefined。如果以new Func()形式调用且返回值不是对象,则返回this(该新对象)。

  • 模块:一个定义了私有变量和函数的函数,利用闭包创建可访问私有变量和函数的接口函数,最后返回这个接口函数,或者直接把接口内容存进某个可访问的函数中。

  • 基于prototype继承是基于对象的继承,而不是基于类的继承

  • 继承最好使用函数化模式:

      var constructor = function(kv) {
          私有实例变量(可通过闭包访问)
          var that = 要继承的一个新对象
          给that添加属性或方法
          return that
      }
  • 数组只是类似数组的对象,它把数组下标转成字符串,用其作为属性。可存放任意类型元素,内部表示不是线性分配的内存。

  • 数组的length等于其最大整数属性名加1,不一定等于数组的元素个数

References

  1. Javascript秘密花园
  2. 《Javascript语言精粹》

Promise

  • caller调then(callback),callee调resolve(),两者都被调用后callback才会执行
  • 多个then()链式调用时,上一个then()的返回值是下一个then()的输入参数
  • then(callback, errback)的errback可提供reject()后的错误处理

References

  1. JavaScript Promises … In Wicked Detail