《JavaScript语言精粹》读书笔记
做点笔记。
精华
null
语法
- 避免使用
/* */
来写注释,使用//
写注释。 - js不允许获取对象属性的时候使用点运算获取属性名为js保留字的属性。
- 超过js数字表示极限的值都会被认为是
Infinity
。 - 字符串不可被改变。
- falsy:
false
,null
,undefined
,''
,0
,NaN
。 - truthy:不是以上falsy的都属于truthy。
对象
- 对象中的属性名如果不是合法的变量名,则需要用括号包裹。
- 对象中的属性名如果是合法的变量名,则可以用
.
代替[""]
。 - 可以使用
||
给一个默认值。 var a = b = c = {}
三个变量都指向同一个对象,var a = {}, b = {}, c = {}
三个变量指向不同的对象。
函数
- 函数也是对象,可以被保存在变量、对象、数组中。
- 函数也可以作为参数或者返回值。
- 一个函数可以定义在另一个函数里,里层函数可以获取外层函数中的局部变量以沟通函数和函数外,称之为闭包。
- 调用函数的时候会中断当前执行的函数,将控制权交给新函数并给新函数传参。
- 函数出了接受形参,还接受
this
和arguments
这两个参数。 - 当函数被保存在对象中的一个属性中时,就叫做对象的方法。
this
的指向。- 构造函数首字母大写,并且只能
new
调用。 arguments
其实是一个类数组对象。- 函数总是会有返回值,如果没有指定返回值则返回
undefined
。 - 如果函数被调用时前面有
new
,且返回值不是对象,则返回this
。
在 Function
原型链上添加一个原型方法method,用于给函数对象添加方法:
1 | Function.prototype.method = function(name, func) { |
- js没有尾递归优化,深度递归可能栈溢出。
- 尾递归:是一种在函数最后执行递归调用语句的特殊形式的递归。
- 尽量在文件或者函数顶部申明用到的所有变量。
- 回调函数可以异步处理数据。
- 级联:将没有
return
的函数返回this
就可以创造级联,也就是链式调用。 - 柯里化
- 记忆: 存储中间结果来优化算法,比如可以优化斐波那契数列的递归算法。
继承
- 不同于其他语言使用类来继承,js使用原型
prototype
来继承。 - 构造函数要以大写开头。
- 尽量使用对象而不是参数序列来作为传入的参数。
这章有些地方没看懂,有时间再看一遍。
数组
- 给数组添加非index的属性名不会改变数组的
length
。
正则
null
方法
null
代码风格
null
优美的特性
null
附录A:毒瘤
- 全局变量
- 作用域
- 自动插入分号
- 保留字(引用对象中的属性名恰好和保留字一样时需要用
obj['property']
的方式引用) typeof()
parseInt()
- 浮点数不精确(可以通过先乘以一个数变为整数,运算完了再除回来)
NaN
- 伪数组
- Falsy
hasOwnProperty()
- 对象
附录B:糟粕
- 不要用
==
和!=
- 不要用
with
- 不要用
eval
,同理也不应该用Function
构造器,也不要给setTimeout
和setInterval
传字符串参数。 - 不要用
continue
- 注意
switch
穿越 - 尽量不用
++
和--
- 位运算符在js中实际运行很慢。
- 包装对象,不要使用
new
创建包装对象,直接申明字面量即可。 - 使用首字母大写命名构造函数,使用
new
掉用构造函数。 - 不要使用
void
附录C:JSLint
null