JS中所有对象隐式转换都是True?除了他...

开发 前端
document.all会返回一个HTMLAllCollection集合,包含document下所有节点。可以理解为是一个「包含页面中所有DOM节点的集合」

[[437695]]

大家好,我卡颂。

根据ES规范[1]规定,所有非原始类型的对象转化为Boolean都为true:

但是这里有个特例:document.all

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

document.all的作用

document.all会返回一个HTMLAllCollection集合,包含document下所有节点。可以理解为是一个「包含页面中所有DOM节点的集合」:

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

  1. // 获取页面中第一个节点,即HTML 
  2. document.all[0]; 
  3.  
  4. // 获取页面中id为"abcd"的节点 
  5. document.all["abcd"]; 

随着WEB发展,其作用已经逐渐被document的其他方法取代,比如:

  • getElementById
  • querySelector
  • ......

负重前行的W3C

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

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

  1. if (document.all) { 
  2.   // 老浏览器 
  3. else if (document.getElementById) { 
  4.   // 支持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

 

责任编辑:姜华 来源: 魔术师卡颂
相关推荐

2022-02-23 21:24:21

索引SQL字符

2009-09-04 10:49:19

C#隐式转换

2010-02-04 16:47:04

C++隐式转换

2009-07-21 13:54:55

Scala重载方法隐式转换

2023-08-14 08:35:36

2017-12-20 14:14:16

数据库MySQL数据类型

2017-09-13 10:58:51

JavaScript转换规则

2023-04-27 09:08:19

JavaScript隐式类型转换

2023-09-22 09:04:00

C++编程

2017-09-05 16:17:35

JavaScript运算转换

2010-11-16 15:11:52

Oracle隐式游标

2023-12-12 08:50:22

MySQL隐式转换varchar

2015-05-20 12:48:34

戴尔云计算

2010-07-19 09:40:59

SQL Server数

2024-09-26 12:33:29

JSAPI循环

2019-09-28 22:41:18

OracleMySQL隐式数据

2024-08-28 08:50:11

MySQL核心模块

2022-06-01 08:12:32

JS类数组对象

2015-07-29 10:54:58

Java 8包列表

2009-09-01 10:49:28

C#具有隐式类型声明
点赞
收藏

51CTO技术栈公众号