语法
- /*形式的注释因为正则表达式中可能会出现这些字符,所以建议都使用//来进行注释
- 数字在JS内部统一表示为64位的浮点数,所以1和1.0的值是相同的
- NaN不等于任何值,包括它自己
- 所有字符都是16位的,没有字符类型,可以通过包含一个字符的字符串表示
- 常用转义字符:" ' \ / \b \f \n \r \t \uxxxx
- 字符串是不可变的,两个包含着完全相同的字符且字符顺序也相同的字符串认为是相同的字符串(===相等)
- 在函数内部用var声明的变量是该函数的私有变量
- 只有函数作用域和全局作用域,所以花括号式的代码块不会创建新的作用域
- 除了false、null、undefined、空字符串、0、NaN外,其他值都为真
- switch语句执行表达式,对产生的数字或字符串进行case匹配,case表达式不一定必须是常量
- for in语句枚举对象的所有属性名或键名
- switch、while、for和do语句可以有个前置标签,然后可以用break <label>来退出该该标签的语句
- typeof的结果:number、string、boolean、undefined、function和object(typeof null结果为object)
- 只有两个运算数都为数字时,+才是加法运算
对象
- 对象是可变的"key/value"对的集合,除了数字、字符串、布尔值、null和undefined外,其他诸如数组、函数、正则表达式等值都是对象;尽管数字、字符串和布尔值拥有方法,但它们是不可变的,所以并不是对象
- 对象是属性的容器,每个属性都有名字和值,属性名可以是包括空字符串在内的任意字符串,属性值可以是除undefined外的任何值
- 对象是无类型的,所以对新属性的名字和值没有限制
- 属性名为一个合法的JS标识符且不是保留字时,在对象字面量中可以不用引号包括,在对象获取属性时可以用.来获取(不然就得使用["name"]这样的形式)
- 对undefined获取属性会抛出TypeError异常,可以先用&&运算符来避免错误
- 对象通过引用来传递,永远不会被复制
- 每个对象都连接到一个原型对象,通过对象字面量创建的对象连接到Object.prototype
- 对对象的改变,不会修改原型;只在获取属性时,但是对象没有时,才会从原型链上去查找这个属性(即为委托)
- 原型新增的属性会立即对所有基于该原型创建的对象都可见
- 用hasOwnProperty方法可以判断是否为对象独有的属性
- for in语句可用来遍历对象的所有属性名,包括原型中的属性(前提是该属性是可遍历的)
- delete可以删除对象的属性,但不会删除原型链中的属性,所以可能会让原型链中的属性透现出来
函数
- 函数对象的原型对象是Function.prototype(它又连接到Object.prototype)
- 函数对象在创建时会配一个prototype属性,其值为一个对象,该对象拥有一个constructor属性,值为该函数
- 每个函数都接收两个附加的参数:this和arguments,其中this的值取决于调用模式(共有4中调用模式:方法调用模式、函数调用模式、构造器调用模式和apply调用模式),this的绑定是迟绑定,在函数调用那一刻才决定
- 方法调用模式:函数作为对象的一个属性时,就称为方法,通过.或[]来调用时就是方法调用,此时this被绑定到该对象
- 函数调用模式:非对象属性时,就当作函数,此时this被绑定到全局对象(方法内部声明的函数就无法通过this访问方法所属的对象,一般通过在方法多声明一个that变量并赋值为this,然后在内部函数使用that即可解决)
- 构造器调用模式:带上new来调用函数(构造器函数,一般约定首字母大写),此时会创建一个新对象,其原型连接到函数的prototype属性对象,另外函数的this会绑定到新对象上
- Apply调用模式:调用函数的apply方法,该方法第一个参数为要绑定给函数的this的值,第二个参数为一个参数数组
- 函数的隐藏参数arguments只是一个拥有length属性的类似数组的对象,并没有任何数组的方法
- 带new调用的函数,如果返回值不是对象,则返回this(即新生成的对象)
- 通过throw来抛出一个包含name和message属性的exception对象,try用于捕捉
- 可以给基本类型扩充功能,例如给Object.prototype增加方法让所有对象都可用,但是要在类库混用的时候要注意,避免错误覆盖
- 因为JS只有函数作用域和全局作用域,而没有块级作用域,所以尽量在函数体的顶部声明函数中可能用到的所有变量
- 闭包使得内部函数能访问外部的实际变量(类似引用而非复制,需要复制的效果可以使用函数参数传值的方式)
- 避免在循环中创建函数
- 模块模式:一个定义了私有变量和函数的函数;利用闭包,该函数内部创建一个可以访问私有变量的特权函数,最后返回这个特权函数
数组
- JS的数组其实是类数组特性的对象
- 每个数组都有一个length属性,其值是数组最大的整数属性名加1,给数组增加一个非整数属性时,不会改变它的length
- 把length设小将会导致所有下标大于等于新length的属性被删除
- 用delete删除数组元素会导致空洞,一般使用splice方法
正则表达式
- 建议使用正则表达式字面量来创建正则表达式
- 用正则表达式字面量创建的RegExp对象共享同一个单例
- 需要转义的字符:\ / [ ] ( ) { } ? + * | . ^ $
- .匹配除行结束符以外的任何字符