体面编码之JavaScript


避免依赖null和之间的区别undefined。这样做往往会导致代码脆弱。在对它们中的任何一个进行相等性检查时使用非强制相等(==)null。避免使用两者来表示不同类型的“无值”情况,例如“unknown field”与“no value for today”。

谨防用真假检查零。如果存在数字,则通常需要以与任何其他数字相同的方式对待 - 与其他假值不同。

浮点运算,有其常见的陷阱。考虑在客户端尽可能少地做和/或使用JavaScript数字库

注意不同浏览器中的功能支持。要么仅使用应用程序支持的所有浏览器支持的那些,要么执行渐进增强。请参阅我可以使用[url=https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/PromiseBrowser_compatibility]MDN文档页面[/url]上的参考,浏览器兼容性表和ECMAScript兼容性表。使用linter插件自动执行兼容性检查。某些功能可能会由您的构建设置进行转换,或者是polyfilled - 使它们可以在旧版浏览器中使用。

避免setTimeout()或类似脆弱或不明白的方式。通过在经过仔细选择(通常通过反复试验)时间延迟之后运行一段代码,可能会出现可能很难实现/修复的方案。这种方法起作用的原因(至少在某些时候)很少为作者所知,并导致脆弱和不可预测的行为 - 特别是当延迟非零时。

注意在可能不期望的情况下变异的实例方法。这些包括Array的就地reverse(),以及许多Moment.js方法(认真考虑替代方法,如date-fns或Luxon)。

Array sort()将元素转换为字符串,并默认按字母顺序对它们进行排序。对于除字符串以外的任何东西,这不太可能是想要的 - 必须给出比较器功能。

字符串replace()仅在使用字符串作为模式时替换第一个匹配项。全局替换需要使用正则表达式。

尽可能避免duck类型检查。如果对duck进行改变,它们很容易破碎,并且不能很好地传达意图。

避免通过交叉读取和写入导致布局颠簸。组读取和写入尽可能导致布局/重排的属性

避免过度工作以响应用户输入。这包括计算,屏幕更新和对服务器的请求。考虑去抖动或限制键盘输入和某些类型的鼠标事件。

避免使用过时的技术。语言的进步继续为许多传统技术带来更新,更好的替代方案。使用它们。示例包括async / await和模板字符串。