大家好,我是Kason。根据ES规范[1],所有非原始对象转换为Boolean都是true:但这里有一个特例:document.all这篇文章会讲到这个冷知识。document.all的作用document.all会返回一个HTMLAllCollection集合,包括文档下的所有节点。可以理解为“页面中所有DOM节点的集合”:早期的web开发者使用该API获取DOM节点,例如://获取页面中的第一个节点,即HTMLdocument.all[0];//获取页面中id为"abcd"的节点document.all["abcd"];随着WEB的发展,它的作用逐渐被document的其他方法所取代,比如:getElementByIdquerySelector......负载很重的W3C虽然有更好的API,但很多旧的页面仍然使用document.all.如何更好的过渡?为了兼容性,很多开发者会写如下代码:if(document.all){//旧浏览器}elseif(document.getElementById){//支持getElementById的现代浏览器}问题是,很多现代浏览器也实现了document.all,这将允许代码在所有浏览器中进入“旧浏览器”逻辑。从2009年6月到2009年10月,W3C邮件列表[2]上关于document.all的消息多达56条。第一封讨论邮件的最终讨论结果是:在现代浏览器中,将document.all转换为Boolean的结果为false。这样上面的代码在现代浏览器下就不会进入“老浏览器”的逻辑了。总结除了以上特点,document.all还有一些不同于常人的特点,比如:当作为==和!=运算符的比较对象时,会被认为是undefinedtypeofdocument.all==='undefined'这些奇怪的东西结果都是为了浏览器向后兼容。尽管许多现代浏览器都支持document.all,但它已从标准中删除。目前唯一能想到的作用大概就是和面试官争论了。。。参考[1]ES规范:https://262.ecma-international.org/5.1/#sec-9.2[2]W3C邮件列表:https://www.w3.org/Search/Mail/Public/advanced_search?keywords=typeof+document.all&hdr-1-name=subject&hdr-1-query=&hdr-2-name=from&hdr-2-query=&hdr-3-name=message-id&hdr-3-query=&period_month=&period_year=&index-grp=Public__FULL&index-type=t&type-in??dex=public-html&resultsperpage=100&sortby=date-asc
