《JavaScript语言精粹》读书笔记

《JavaScript语言精粹》读书笔记

做点笔记。

精华

null

语法

  • 避免使用/* */来写注释,使用//写注释。
  • js不允许获取对象属性的时候使用点运算获取属性名为js保留字的属性。
  • 超过js数字表示极限的值都会被认为是Infinity
  • 字符串不可被改变。
  • falsy:false, null, undefined, '', 0, NaN
  • truthy:不是以上falsy的都属于truthy。

对象

  • 对象中的属性名如果不是合法的变量名,则需要用括号包裹。
  • 对象中的属性名如果是合法的变量名,则可以用.代替[""]
  • 可以使用||给一个默认值。
  • var a = b = c = {}三个变量都指向同一个对象,var a = {}, b = {}, c = {}三个变量指向不同的对象。

函数

  • 函数也是对象,可以被保存在变量、对象、数组中。
  • 函数也可以作为参数或者返回值。
  • 一个函数可以定义在另一个函数里,里层函数可以获取外层函数中的局部变量以沟通函数和函数外,称之为闭包。
  • 调用函数的时候会中断当前执行的函数,将控制权交给新函数并给新函数传参。
  • 函数出了接受形参,还接受thisarguments这两个参数。
  • 当函数被保存在对象中的一个属性中时,就叫做对象的方法。
  • this的指向。
  • 构造函数首字母大写,并且只能new调用。
  • arguments其实是一个类数组对象。
  • 函数总是会有返回值,如果没有指定返回值则返回undefined
  • 如果函数被调用时前面有new,且返回值不是对象,则返回this

Function 原型链上添加一个原型方法method,用于给函数对象添加方法:

1
2
3
4
5
6
Function.prototype.method = function(name, func) {
if (!this.prototype[name]) {
this.prototype[name] = func;
}
return this;
}
  • js没有尾递归优化,深度递归可能栈溢出。
  • 尾递归:是一种在函数最后执行递归调用语句的特殊形式的递归。
  • 尽量在文件或者函数顶部申明用到的所有变量。
  • 回调函数可以异步处理数据。
  • 级联:将没有return的函数返回this就可以创造级联,也就是链式调用。
  • 柯里化
  • 记忆: 存储中间结果来优化算法,比如可以优化斐波那契数列的递归算法。

继承

  • 不同于其他语言使用类来继承,js使用原型prototype来继承。
  • 构造函数要以大写开头。
  • 尽量使用对象而不是参数序列来作为传入的参数。

这章有些地方没看懂,有时间再看一遍。

数组

  • 给数组添加非index的属性名不会改变数组的length

正则

null

方法

null

代码风格

null

优美的特性

null

附录A:毒瘤

  • 全局变量
  • 作用域
  • 自动插入分号
  • 保留字(引用对象中的属性名恰好和保留字一样时需要用obj['property']的方式引用)
  • typeof()
  • parseInt()
  • 浮点数不精确(可以通过先乘以一个数变为整数,运算完了再除回来)
  • NaN
  • 伪数组
  • Falsy
  • hasOwnProperty()
  • 对象

附录B:糟粕

  • 不要用==!=
  • 不要用with
  • 不要用eval,同理也不应该用Function构造器,也不要给setTimeoutsetInterval传字符串参数。
  • 不要用continue
  • 注意switch穿越
  • 尽量不用++--
  • 位运算符在js中实际运行很慢。
  • 包装对象,不要使用new创建包装对象,直接申明字面量即可。
  • 使用首字母大写命名构造函数,使用new掉用构造函数。
  • 不要使用void

附录C:JSLint

null

评论