前言

接触JavaScript也有一段时间了,好早之前就在各方的JavaScript经典书籍推荐上纷纷提到过这本书。其实我也忘了是什么原因导致我好几次刚开始阅读这本书就中断了。这几天我就花了点时间仔细阅读了这本书。并写下这篇博客记录自己的收获,备忘。(按照本书的目录结构整理)

第一章:精华

浏览器的API和文档对象模型DOM相当糟糕,它的规范制定的很拙劣并且实现互不一致。

那些优秀的想法包括:函数, 弱类型, 动态对象和富有表现力的对象字面量表示法。那些糟糕的想法包括给予全局变量的编程模型。

词法作用域是词法分析的过程中指派的作用域,在词法解析过程中定死。动态作用域在代码运行时定义,非代码解析时。动态不关心哪里声明,关心在哪里调用,和this相似,基于调用栈,词法作用域相反。

JavaScript是一门弱类型语言。JavaScript有非常强大的对象字面量表示法。

第二章:语法

没有用的注释比没有注释更糟糕。/ /注释可能会在正则表达式上出错。

JavaScript保留字里面有一些本应该被保留而没有被保留的字,包括undefinedNaNInfinity

JavaScript只有一种数字类型,它在内部被表示为64位浮点数。整数部分按照54位来算。

只有下面被列出来的值被当做假(false):falsenullundefined,空字符串 ‘ ‘,数字 0, 数字NuN

typeof运算一个数组或者null,那么结果是'object'

定义字面量的时候,属性名可以是标识符或者字符串,对象的属性名是在编译的时候才能知道。

第三章:对象

数组是对象,函数是对象,正则表达式是对象,对象自然也是对象。属性名可以是包括空字符串在内的任意字符。JavaScript里面标识符包含连接符(-)是不合法的。

删除对象的属性可能会让来自原型链中的属性透现出来。(暴露出原型的接口)。

第四章:函数

JavaScript设计最出色的地方就是它的函数实现。

函数的参数将被定义为函数中的变量。每个函数还会接受两个附加的参数:thisarguments

this有4种调用模式:1.方法调用 2.函数调用模式 3.构造器调用模式 4.apply调用模式

方法调用模式:this到对象绑定发生在调用的时候。这个‘超级’延迟绑定使得函数可以对this高度的复用。

函数调用模式:this绑定到全局对象,这是语言设计上的一个错误。this应该绑定到外部函数的this变量。

arguments数组可以访问函数被调用的时候传递给的全部参数,包括那些没有分配给函数声明是定义的形式参数的多余参数。arguments是一个类数组对象。

JavaScript没有提供尾递归优化。尾递归优化是函数返回自身地柜调用的结果,那个调用的过程会被替换成一个循环,显著提高速度。JavaScript深度递归可能会因为堆栈溢出而运行失败。

闭包

(自己总结)闭包的应用场景:1.保护函数内变量安全:迭代器,生成器 2.在内存中维护变量:缓存数据, 柯理化。this指向上一个执行环境。

在闭包里面方法不是访问该参数的一个副本,它访问的是该参数本身。(执行环境未被销毁)

模块

模块是一个提供接口却隐藏状态与实现的函数或者对象。(存在在执行环境中的私有变量)。

模块的一般形式是:一个定义了私有变量和函数的函数;利用闭包创建可以访问私有变量的函数的特权函数;最后返回这个特权函数,或者把它们保存到一个可以访问的地方。

级联

在方法的return处返回this而不是undefined。级联技术可以产出极富表现力的接口。

一个接口没有必要做太多的事。

第五章:继承(没有看的很明白)

函数化

继承模式的一个弱点就是没有办法保护隐私。我们有更好的选择就是应用模块模式。

该函数包括四个步骤:
1.创建一个新对象,有很对的方法可以构造一个对象。可以用对象字面量,或者new一个构造器函数,或者使用Object.create方法构造一个已存在函数的实例,或者调用任意一个会返回一个对象的函数。
2.有选择的定义私有实例变量和方法。
3.给新对象扩充方法。这些对象有特权取访问参数。
4.返回那个新对象。

部件

(里面有一个很好的例子)把一套部件组装出来。

第六章:数组

JavaScript里的数组都是类数组对象。没有真正意义上的数组。

JavaScript数组的length是没有上界的。如果你使用大于等于当前length的数字作为下标来存储一个元素,那么length会被增大,不会发生数组越界错误。

可以通过检查constructor属性判断是不是数组还是对象

第九章:代码风格

JavaScript的弱类型和过度的容错性导致程序质量无法在编译的时候获得保障。

我对代码块内容和对象字面量缩进4个空格。我放了一个空格在if之间,让if看起来不想是函数调用。

我在除了.[的所有的中置运算符的两边都放了空格。

{放在一行的结尾而不是下一行的开始,因为它会避免JavaScriptreturn语句中一个可怕的设计错误。

JavaScript中,我更喜欢使用行注释,我把快注释用于正式文档记录与注释。

在每个函数开始的部分声明我所有的变量。

不允许switch语句块中的条件穿越到下一个case语句。

使用闭包能提供进一步的信息隐藏,增强模块的健壮性。

第十章:优美的特性

精简的JS都是好东西,包括

1.函数是顶级对象。在精简的Js中,函数是有词法作用域的闭包
2.基于原型继承的动态对象。对象是无类别的。我们可以通过普通的赋值给任意对象增加一个新成员属性,一个对象可以从另一个对象继承成员属性。
3.对象字面量和数组字面量。这对创建新的对象和数组来说是一种非常方便的表示法。JS字面量是数据交换格式JSON的灵感之源。

后记

一本好书是,就算是只有薄薄的一百五十多页,但也是全程高能,根本停不下来啊。看完之后对于JavaScript这门语言有了更加全面的认识。任何一门被人们广泛使用语言都是有其过人之处,当然也有其糟粕,甚至是毒瘤。