关于javascript:JS中所有对象都是truthy除了他

40次阅读

共计 855 个字符,预计需要花费 3 分钟才能阅读完成。

大家好,我卡颂。

依据 ES 标准规定,所有 非原始类型的对象 转化为 Boolean 都为true

然而这里有个特例:document.all

本文就来聊聊这个冷常识。

document.all 的作用

document.all会返回一个 HTMLAllCollection 汇合,蕴含 document 下所有节点。能够了解为是一个 蕴含页面中所有 DOM 节点的汇合

晚期的 web 开发者用该 API 获取DOM 节点,比方:

// 获取页面中第一个节点,即 HTML
document.all[0];

// 获取页面中 id 为 "abcd" 的节点
document.all["abcd"];

随着 WEB 倒退,其作用曾经逐步被 document 的其余办法取代,比方:

  • getElementById
  • querySelector

……

负重前行的W3C

尽管有了更好用的API,但很多老页面还在应用document.all。如何更好的过渡呢?

为了兼容,很多开发者会写出如下代码:

if (document.all) {// 老浏览器} else if (document.getElementById) {// 反对 getElementById 的古代浏览器}

问题是,很多古代浏览器也实现了 document.all,这就会让代码在所有浏览器中都进入 老浏览器 的逻辑。

从 09 年 6 月到 10 月,对于 document.all 的 W3C 邮件列表有 56 封之多。

最初的探讨后果是:在古代浏览器中,document.all转化为 Boolean 的后果为false

这样,上述代码在古代浏览器下就不会进入 老浏览器 的逻辑。

总结

除了以上个性,document.all还有些异于常人的个性,比方:

  • 当被作为 ==!=操作符的比拟对象时,会被当作undefined
  • typeof document.all === 'undefined'

这些乖僻后果都是为了浏览器向下兼容。尽管很多古代浏览器都反对document.all,但他曾经从规范中删除。

我能想到他以后惟一的作用,大略就是和面试官抬杠吧 ……

欢送退出人类高质量前端框架群,带飞

正文完
 0