《重构》、《js高级程序设计》一些笔记知识点
约 1212 字大约 4 分钟
2025-07-30
《重构(第 2 版) : 改善既有代码的设计》
函数命名:以它“做什么”来命名,而不是以它“怎么做”来命名。
一个改进函数名字的好方法:先写一句注释描述这个函数的用途,再把这句注释变成函数的名字。
每当看见一段代码在同时处理两件不同的事,我就想把它拆分成各自独立的模块,因为这样到了需要修改的时候,我就可以单独处理每个主题,而不必同时在脑子里考虑两个不同的主题。
- 最简洁的拆分方法之一,就是把一大段行为分成顺序执行的两个阶段。
- 你常能见到一些身兼多职的循环,它们一次做了两三件事,不为别的, 就因为这样可以只循环一次。但如果你在一次循环中做了两件不同的事,那么每当需要修改循环时,你都得同时理解这两件事情。
分解条件表达式。
- 在带有复杂条件逻辑的函数中,代码(包括检查条件分支的代码和真正实现功能的代码)会告诉我发生的事,但常常让我弄不清楚为什么会发生这样的事。
- 对于条件逻辑,将每个分支条件分解成新函数还可以突出条件逻辑,更清楚地表明每个分支的作用,并且突出每个分支的原因。
将查询函数和修改函数分离。
《JavaScript 高级程序设计:第 2 版》
检测类型
- 检测基础数据类型
typeof
:String, Number, Boolean, undefined
(typeof 'str') - 检测引用类型
instanceof
:person instanceof Array/Object/RegExp
(引用类型 instanceof Object 会始终返回 true,基本类型 instanceof Object 会始终返回 false) - 避免和
null
比较。改为typeof / instanceof
;如果是希望对象包含某个特定的方法名,则使用typeof
确保指定名字的方法存在于对象上。 - 代码中的
null
比较越少,就越容易确定代码的目的,并消除不必要的错误。
访问变量属性
- 点表示法:只可以使用字符串
person.name
- 方括号语法:可以使用变量
let personName =name; person[personName]
- 通常,除非必须使用变量来访问属性,否则我们建议使用点表示法。
所有对象都有 toLocaleString(), toString(), valueOf()
方法。
重排序方法: reverse(), sort()
- 默认情况下,
sort()
按照升序排列数组项。sort()
会调用每个数组项的toString()
方法,然后比较得到的字符串并排序,即使数组中的每一项都是数值,sort()
比较的也是字符串。 - 因此
sort()
可以接收一个函数作为参数,以便我们指定哪个值排在前面。
在 javascript
中,没有任何代码是立刻执行的,但一旦进程空闲则尽快执行。
- 如设定一个 150ms 后执行的定时器不代表 150ms 后代码立即执行,它表示代码会在 150ms 后被加入到队列中。如果这个时间点上,队列中没有其它东西,那么这段代码就会被执行,表面上看上去好像代码就在精确指定的时间点上执行了。其它情况下,代码可能明显地等待更长时间才执行。
函数节流背后的基本思想是指:某些代码不可以在没有间断的情况连续重复执行。
- 函数节流在
resize
中最常用。
变量和函数命名
- 变量名应为名词,如
car, person
。 - 函数名应该以动词开头,如
getName()
。 返回布尔类型的函数一般以is
开头,如isEnable()
。 - 变量和函数都应该使用合乎逻辑的名字,不要担心长度,长度问题可以通过后处理和雅俗来缓解。
原生的方法比较快:只要有可能,使用原生方法而不是自己重写一个。(原生方法是 c/c++
写的,比 js
的快很多。
switch
语句较快:还可以通过将 case
语句按照出现概率从大到小来进一步优化 switch
语句。
位运算符比较快: 可以选择性地用位运算代替算术运算,如取模、逻辑与、逻辑或等。
map(), filter(), some(), every(), forEach()
都可以让数组的处理变得更简单。
解构赋值: 当一个对象字面量出现在等号左边时,就认为它是一个解构赋值。
var [name, value] = ["color", "red"]; //一次给 2 个变量赋值
var value1 = 5;
var value2 = 10;
[value1, value2] = [value2, value1]; //交换两个变量的值