Behind a Gist
这是 8 月 26 日在前端架构懒懒分会上的分享:slide@github(请用 Chrome 浏览)
掺杂了两个主要话题:一个是老生常谈的兼容性探测代码的写法,另一个是 JavaScript 比较语句中的隐性转换。
什么叫伪特性探测?看代码:
if(window.ActiveXObject) {
// 一堆和 ActiveXObject 半毛钱关系都没有的代码
}
微探测的研究和探索精神都很值得推崇,但正式代码中尽量少用。质朴清晰更重要,能节省团队和自己未来的理解时间。
UA 不是恶魔,在大部分情况下,UA 是最可靠的。
探测代码的关键是尽量做到能自适应未来版本和自适应未知设备。针对特定版本的浏览器嗅探不会带来隐患:
if(ie < 7) {
// 给 ie 增加 css 的 hover 支持
}
想想,上面的代码用特性探测如何写?可以把浏览器嗅探看成是打包了一堆特性的特性探测,只要这一堆特性是稳定的,不会给未来版本带来隐患,这时浏览器嗅探就是合理的,该用时就大胆用。(注意:大部分情况下,不带版本号的浏览器嗅探会给未来版本留下垃圾代码甚至隐患,要慎用。)
第二个话题是解释 a == b 的判断规律,详见 behind-a-gist.html#slide20. 弱类型动态语言,为了方便用户使用,一般都会自动进行类型的隐性转换。Douglas Crockford 认为 == 是糟粕,但实际上只要掌握了其中的转换规律,糟粕也可以成为精华。一个非常棒的应用是:
// 让 UA.ie 的默认值是 undefined, 在 ie 下,UA.ie = ie 的主版本号
// 这样,
if(UA.ie < 8) {
// 针对 ie6 和 ie7 的代码
}
上面的 API 微设计,利用了 undefined < 8 为 false 的特性,有效避免了不少类库里的冗余写法 if(UA.ie && UA.ie < 8) { }.
探测代码 – 大道无形,道法自然。
a == b – 此中有真意,欲辩已忘言。


