前端之旅:《Javascript 语言精粹》学习笔记

javascript语言精粹简要笔记

由于个人很喜欢DC这本书的这种开篇方式,所以将其对莎士比亚著作的引用也写进来了,以下如未做特殊说明,引用内容均来自该书。

##1. 精华

……我不过略有些讨人喜欢的地方而已,怎么会有什么迷人的魔力?

2. 语法

我很熟悉它,早就在文法书上念过了

作者用铁路图(语法图)来表示了js语法中的

  • 空白,多行注释/**/会和/a*/这样的正则表达式冲突
  • 标识符,可以以字母、下划线、美元符号开头
  • 数字,js只有一个数字类型,内部表示为64位浮点数,isNaN可以检测NaN类型
  • 字符串,字符串一旦创建,就不可变
  • 语句,js的代码块不会创建新的作用域
  • 表达式
  • 字面量
  • 函数

3. 对象

对于丑陋的事物,爱会闭目无视

  • js对象是可变的键值对集合,属性名可以是包括空字符串在内的任意字符串,属性值可以是除了undefined外的任何值
  • 每个对象都连接到一个原型对象,所有通过对象字面量创建的对象都连接到Object.prototype
  • 从原型链中检索属性值的过程称为委托

4. 函数

所有的过失都在未犯以前,都已定下应处的惩罚

  • js中函数就是对象
  • 调用一个函数会暂停当前函数的执行,传递控制权和参数给新函数,除了声明时定义的形参,每个函数还接收两个附加参数thisarguments
  • this的值取决于调用的模式,js中一共有4中调用模式:
    • 方法调用模式,一个函数作为对象的属性就是方法,当一个方法被调用时,this被绑定到该对象
    • 函数调用模式,一个普通函数(非方法)被调用时,this绑定到全局对象
    • 构造器调用模式,在一个函数前带上new关键字来调用,内部会创建一个连接到该函数原型的新对象,同时this被绑定到那个新对象上
    • apply调用模式,js提供了applycall两个方法来更改this的绑定对象
  • arguments保存了调用时的参数列表,它只是一个‘类数组对象’,除了有一个length属性外,没有任何数组方法
  • js允许给语言的基本类型扩充功能
  • js只有函数作用域和全局作用域
  • 可以使用函数和闭包来构建模块,模块模式的一般形式是:一个定义了私有变量和函数的的函数;利用闭包可以创建可以访问私有变量和函数的特权函数;

5. 继承

……往往会把一件完整的东西化成无数的形象,就像凹凸镜一般,从正面望去,只见一片模糊

本章作者介绍了几种实现继承的方式:

  • 伪类:用繁琐的模仿其他面向对象语言的方式来实现继承
  • 原型:也叫差异化继承,通过创建一个父类对象,然后在其基础上添加自定义属性
  • 函数化:也叫应用模块模式,通过4个步骤来实现
    1. 创建一个新对象
    2. 有选择的定义私有变量和方法
    3. 给这个新对象扩充方法
    4. 返回那个对象

6. 数组

你这披着羊皮的狼,我要把你赶走

  • js数组的length没有上界
  • js数组也是对象,js中一切皆对象
  • 使用数组还是对象?一个简单的规则是:当属性名是小而连续的整数时,使用数组,否则使用对象

7. 正则表达式

相反地,选到一个称心如意的配偶,就能百年谐和,幸福无穷

  • js中会用到正则表达式的方法有:regexp.execregexp.teststring.matchstring.replacestring.splitstring.search
  • 正则表达式分组
    • 捕获型()
    • 非捕获型(?:)
    • 向前正匹配(?=)(!bad)
    • 向前负匹配(?!) (!bad)

8. 方法

他虽疯,但却有他的一套理论

9. 代码风格

好一串嘟嘟囔囔的头衔!

讲了作者推崇的一些风格,比如缩进4个空格、不允许case语句穿越、唯一全局变量等等

10. 优美的特性

我让你的脚玷污我的嘴唇,让你的肖像玷污我的眼睛,让你的每一部分玷污我的心,等候着你的答复

附录A. 毒瘤

那会在一言一行中证明其可怕

  • js对全局变量的依赖降低了程序的可靠性
  • 由于js有函数作用域但是没有块级作用域,所以更好的方式是在每个函数开头部分声明所有变量
  • 由于js的自动插入分号机制,建议将{放在上一行的结束而不是新行
  • Unicode把一对字符视为一个单一字符,js认为一对字符是两个不同的字符
  • 第二个可选参数是基数,建议总是带上10作为基数
  • js没有真正的数组
  • js中的众多假值,如下表:
类型
0 Number
NaN Number
“abc” String
false Boolean
null Object
undefined Undefined
  • hasOwnProperty可以被重写覆盖
  • js中的对象永远不会是真的空对象

附录B. 糟粕

现在要请你告诉我,你究竟为了我哪一点坏处而开始爱我起来呢?

  • 使用===!==来判断是否相等,而不是==!=
  • 避免使用with,除了不可预料外,它还会阻断变量名的词法作用域绑定
  • 避免使用eval,由于它需要运行编译器,所以降低了语言的性能,还削弱了程序的安全性,除此之外,也尽量避免Function构造器、setTimeout和setInterval的字符串形式的参数
  • 移除continue会使性能得到改善
  • 避免使用switch语句的case条件穿越
  • if,while,do,for总是使用代码块
  • ++--替换为+=-=
  • js位运算的多次转换反而会降低位运算带来的性能提高
  • 使用function表达式而不是语句
  • js有一套类型的包装对象,应该尽量避免使用基本类型值的包装对象来创建基本类型
  • 对于js中的对象,一个更好的策略是不使用new(个人感觉没必要)
  • 避免使用void
avatar

神无

舍悟离迷,六尘不改。