UI层松耦合
将javascript从css中抽离
避免使用css表达式
将css从javascript中抽离
操作样式名
不用javascript直接修改样式
将javascript从html中抽离
不使用on属性(onclick等)绑定事件
最好将所有javascript代码都放在外置文件中
将html从javascript中抽离
从服务器加载模版
使用客户端模版
避免“空比较”
检测原始值
null不用于检测语句
使用typeof检测:字符串,数字,布尔值,undefined(typeof variable)
检测引用值
使用instanceof检测引用值类型(value instanceof constructor)——检测构造函数和原型链
检测函数
typeof(除检测DOM节点)
用in检测DOM节点(如:"querySelectorAll in document")
检测数组
“鸭式辨型”
ES5:Array.isArray()
检测属性
in判断属性是否存在(property in object)——实例对象,原型
仅判断实例对象的某个属性是否存在:hasOwnProperty()
非DOM对象直接用
不确定是否为DOM对象:"hasOwnProperty" in object && object.hasOwnProperty("property")
IE8-,DOM对象不继承自object
抛出自定义错误
try-catch 捕获
throw new Error("error msg") 抛出错误
在错误消息中包含函数名
不直接将字符串作为错误抛出: throw "msg"
何时抛出错误
修改的很难调试的错误,尝试增加自定义错误,当再次发生时容易定位
写代码时,思考你希望不发生什么错误,在这些不希望发生的情况,抛出错误
你编写的代码别人也会用,思考别人的使用方式,在特定情况抛出错误
注意:自定义错误不是越多越好
使用throw还是try-catch
不要将catch留空
错误只应该在程序栈中最深处部分抛出
错误类型
Error-错误的基本类型(所有错误类型都继承自Error)
EvalError-通过eval()函数执行代码发生错误时抛出
RangeError-数字超出边界时抛出
ReferenceError-期望对象不存在时抛出
SyntaxError-给eval()函数传递的代码中有语法错误时抛出
TypeError-变量不是期望类型时抛出
URIError-给encodeURI()、encodeURIComponent()、decodeURI()、decodeURIComponent()等函数传递格式非法的URI字符串时抛出
浏览器嗅探
用户代理检测
navigator.userAgent
原则:能不用就不用,最安全的方法是只检测旧浏览器
特性检测
不依赖于浏览器,仅依据特性是否存在
组成部分
1. 探测标准方法
2. 探测不同浏览器的特定方法
3. 当被探测方法均不存在时提供备用方法
避免特性推断(根据一个特性的存在推断另一个特性是否存在)
避免浏览器推断(通过特性检测判断是某个浏览器)
文件和目录结构
最佳实践
一个文件只包含一个对象
相关的文件用目录分组
保持第三方代码独立(单独放在一个目录里)
确定创建位置
保持测试代码的完整性
基本结构
build:放置最终构建后的文件
src:放置所有源文件,包括用来进行文件分组的子目录
test/tests:放置所有测试文件