JS中所有對象隱式轉換都是True?除了他...
大家好,我卡頌。
根據ES規范[1]規定,所有非原始類型的對象轉化為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郵件列表[2]有56封之多。
第一封討論郵件
最后的討論結果是:在現代瀏覽器中,document.all轉化為Boolean的結果為false。
這樣,上述代碼在現代瀏覽器下就不會進入「老瀏覽器」的邏輯。
總結
除了以上特性,document.all還有些異于常人的特性,比如:
- 當被作為==和!=操作符的比較對象時,會被當作undefined
- typeof document.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-index=public-html&resultsperpage=100&sortby=date-asc