《JavaScript语言精粹》附录(毒瘤、糟粕部分)总结
附录a:毒瘤(英文原文是awful parts,又译糟粕)
全局变量
容易隐式创建,且难以维护。
避免方法:不要使用。可以通过使用JSHint等工具检测、在程序开头声明'use strict';避免。
作用域
JavaScript没有块级作用域。
避免方法:把变量声明放在函数最开始可以避免出意料外的错误。
分号(有争议)
JavaScript的分号的不确定性。
避免方法:能加就加,使用JSHint检测。
这一问题尚有争议,现在社区中也有很多项目倾向不使用分号。具体情况看个人喜好和团队习惯,JSHint也有关闭分号的选项。
保留字
package、int、enum等保留字没有在JavaScript语法中出现,但还是成为了保留字
避免方法:不要使用保留字。
Unicode
JavaScript无法覆盖全部Unicode字符,长度检测会有问题。
typeof
typeof规则不直观。
避免方法:死记硬背(不推荐,考虑团队成员参差不齐,不是所有人都愿背,比如我),或使用lodash等工具库。
parseInt
parseInt(08) === 8 //false
parseInt(08, 10) === 8 //true
避免方法:所有parseInt都要加第二个参数。
浮点数
0.1+0.2 === 0.3 //false
NaN
typeof NaN === 'number' //true
避免方法:使用typeof 变量 === 'number' && isFinite(变量)判断变量是否是Number。不过其实我觉得这一条多数情况也没必要。
没有数组
typeof [] //object
避免方法:自己想办法,或使用ES5才有的Array.isArray或lodash中的_.isArray。
false值太多
0、NaN、''、null、undefined都是false
避免方法:使用===,不要使用==。
hasOwnProperty
这个方法竟然可以被重载。
避免方法:需要时使用Object.prototype.hasOwnProperty或lodash的_.has。
对象
避免给对象属性意外地使用保留的字段,如constructor、prototype。
附录b:糟粕(英文原文是bad parts,又译鸡肋)
==
==会产生强制类型转换,结果不直观。
避免方法:不要使用==和!=,要使用===和!==。
with语句
难以阅读。
避免方法:除非必要(如实现一套模板引擎),不要使用with。
eval
难以阅读、性能低。
避免方法:不使用eval和Function构造函数,不要给setTimeout和setInterval传递字符串参数。
continue
性能低。
switch穿越
case忘了加break或return会继续穿越到下一个case。
避免方法:使用JSHint帮助检查。
可以不在后面用代码块的语句
容易产生阅读歧义、维护也不方便。
避免方法:if、while、do、for后面一律加大括号
位运算符
效率低。不过使用率也比较低。
function语句和function表达式
JavaScript中可以用function xxx(){}和var xxx = function(){};两种方法声明函数,前者可能会发生隐式的变量提升。
避免方法:使用var xxx = function(){};声明函数。
类型包装对象
不要把Boolean、Object、Array当构造函数使,比如var obj = new Object();,要使用字面量声明,比如var obj = {}。
new
一个构造函数即使不用new直接执行也可以正常运行,但结果就不是预期的了。
避免方法:遵循构造函数开头大写的约定。
void
压根没用。
评论(4)