当前位置: 首页 > 知识库问答 >
问题:

为什么是文档。除文件类型外的所有定义。所有返回“未定义”?[副本]

梁丘经艺
2023-03-14

我在研究JavaScript的typeof运算符时,偶然发现了以下奇怪之处:

所有当前浏览器都公开了一个非标准的主机对象文档。类型未定义的所有。

typeof document.all === 'undefined';

虽然规范允许为非标准外来对象自定义类型标记,但它要求这些类型标记不同于预定义的类型标记。文档的情况。所有具有类型标记“未定义”的必须被归类为例外违反规则。

(来源)

我在浏览器中设置了以下内容来测试它:

console.log("typeof: " + typeof document.all);
console.log("toString: " + document.all);

它产生了:

typeof: undefined
toString: [object HTMLAllCollection]

那么为什么是文档呢。都是这样吗?自<代码>文档。所有都是一个对象(在我的浏览器中定义),不应该返回“object”而不是“undefined”?

共有2个答案

令狐唯
2023-03-14

解决方案更新:

document.all !== undefined;
>> true /*otherwise*/ false

自从https://html.spec.whatwg.org/要求。。。

当给定为all返回的对象时,用户代理的行为必须如同抽象等式比较算法在与未定义值和null值进行比较时返回true一样。

但是自从。。。

(使用严格等式比较算法的比较以及与其他值(如字符串或对象)的抽象等式比较不受影响。)

使用静态类型比较运算符(例如:==|!==)可以非常安全地检查HTMLAllCollection对象是否可用和\或在当前UA客户端中是否存在。

然而,动态类型比较运算符将根据规范的要求继续返回假缺失。

document.all != undefined;
>> false /*otherwise*/ false

解决方法(旧)

"all" in document;
>> true /*otherwise*/ false

处理第三方代码时更详细的方法是

delete document.all && "all" in document 
>> true /*otherwise*/ false
谢鸿羲
2023-03-14

看看Html规范中的这个

属性必须返回以文档节点为根的HTMLAllCollection,其过滤器匹配所有元素。

为所有返回的对象有几个异常行为:

>

  • 当给定为all返回的对象时,用户代理必须像JavaScript中的ToBoolean抽象操作返回false一样工作。

    当给定为所有返回的对象时,当与未定义的和空的值进行比较时,用户代理必须像抽象等式比较算法一样返回。(使用严格等式比较算法的比较以及与其他值(如字符串或对象)的抽象等式比较不受影响。)

    用户代理的行为必须确保JavaScript中的typeof运算符在应用于为所有返回的对象时返回字符串“undefined”。

    第三个案子是你的。

    其基本原理是与为旧浏览器设计的代码兼容,如规范中的注释所述:

    此违规行为的动机是希望与两类遗留内容兼容:一类使用document.all的存在作为检测遗留用户代理的方法,另一类仅支持这些遗留用户代理并使用document.all对象而不首先测试其存在。

    希望这对你有意义。

  •  类似资料:
    • 我在chrome控制台中写了这样的表达式: 它返回:

    • 我目前正在学习JavaScript中的“typeof”操作符,但下面的教程给出的结果与我在控制台中看到的不同。使用除“strings”以外的任何内容都将返回未定义。关于自动插入分号,我看到了一些东西,但它们似乎比我目前的问题要复杂一些。对不起,老兵们可能觉得这很傻,但由于某种原因,我找不到问题的答案。 VS代码屏幕截图

    • 我找不到这个职位的申请书http://127.0.0.1:3001/users?name=Slava. 服务器响应“需要名称”。方法getUsers正常工作。数据库工作正常,服务器。js也能工作。我在这里寻找类似的答案,但没有合适的答案。有一些非常古老的答案,但它们并不相关。 这是一项请求:http://127.0.0.1:3001/users?name=bob (我用邮递员送信)

    • 问题内容: 我想知道为什么搜索特定术语会返回索引的所有文档,而不返回包含所请求术语的文档。 这是索引以及我的设置方法:(使用elasticsearch头插件浏览器界面) 然后我添加了一些文档: 因此,现在触发“ plaat”搜索时,人们会希望搜索会返回包含“ plaatstaal”的文档。 但是为我节省了更多的搜索,elasticsearch会恢复所有文档的大小,无论其文本内容如何。我在这里想念什

    • 问题内容: 我试图制作一个延迟X毫秒执行异步函数的函数。 为了演示的目的,以下是异步函数,该函数采用URL: 目的 我在这里的目标是要有一个函数,它将接受X 的参数,然后每隔X ms调用一次,直到不再有其他参数为止。 基本上,我希望每次调用都用X ms分隔。 例如,假设我连续打电话20次。通常,这20个呼叫将立即进行。我想要的是确保20个呼叫之间都存在Xms的延迟。 暂定 解决这个问题的想法是建立

    • 下面JavaScript代码的目的是从随机用户生成器获取数据,并将JSON结果打印到控制台中。在声明后调用函数时,它返回为“未定义”。 为什么这个异步函数返回为未定义,而不是将fetch方法的结果打印到控制台?