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

根据规范,JavaScript中的所有对象都是真实的,但在DOM中,一个非原始对象不是真实的。哪一个

秦承安
2023-03-14

推特上有这样一条推文:

在JavaScript中,所有对象都是真实的(根据规范)。在DOM中,这条规则有一个例外。它是什么?#jsquiz#Fronttrends

有人知道答案吗?

共有3个答案

张智
2023-03-14

好的,使用这个代码

for (var name in document) {
    if (!!document[name] === false && typeof document[name] === 'object' && document.hasOwnProperty(name)) {
        $('#foo').append('document.' + name + '<br />');        
    };
};​

我有这个结果在chrome(结果可能会有所不同)

document.ownerDocument
document.attributes
document.namespaceURI
document.nextSibling
document.webkitCurrentFullScreenElement
document.nodeValue
document.preferredStylesheetSet
document.textContent
document.previousSibling
document.parentNode
document.xmlVersion
document.parentElement
document.localName
document.selectedStylesheetSet
document.prefix
document.xmlEncoding
柯清野
2023-03-14

它是<代码>文档。全部。

它是非标准的,所以最好使用文档。getElementsByTagName(“*”)

淳于新
2023-03-14

免责声明:我就是那个发推特的人:)这是一个我会在我的前沿趋势演讲中问和回答的问题。我在上台前5分钟写了那条推文。

因为推特上140个字符的限制,这个问题有点模糊。我问的真正问题是下面这个。

ECMAScript规范定义如下:

如您所见,根据规范,所有非基本对象(即所有非布尔、数字、字符串、未定义的对象或空对象)都是真实的。然而,在DOM中,有一个例外-是虚假的DOM对象。你知道那是哪一个吗?答案是文档。全部。HTML规范说:

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

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

用户代理必须像JavaScript中的ToBoolean()操作符将为所有返回的对象转换为false值一样。

出于和的目的,用户代理必须像这样工作=

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

这些要求故意违反了编写时的JavaScript规范(ECMAScript第5版)。JavaScript规范要求ToBoolean()运算符将所有对象转换为true值,并且对于某些运算符而言,没有对象作为未定义对象的规定。这种违规行为的动机是希望与两类遗留内容兼容:一类使用文档的存在。所有这些都是检测遗留用户代理的一种方法,并且只支持那些遗留用户代理并使用文档。所有对象均未首先测试其存在性。

因此,document.all是这个ECMAScript规则的唯一官方例外。(在Opera中,document.attachEvent等也是错误的,但这并没有在任何地方规范。)

 类似资料:
  • 问题内容: 我在许多JavaScript简介中都读了很多。我只是不明白。我一直认为对象是具有方法和属性的东西。我了解数组,因为它具有键值对。“字符串”或“数字”或“函数”怎么样?上面列出的这些东西对我来说就像是功能。这意味着您输入了一些东西,然后得到了一些东西。您实际上并没有获得访问属性或其他任何内容。在数组或“对象”列表中没有使用点符号。 是否有人用点符号编写每个方法的示例示例,这些示例的方法和

  • 对于此示例: 如何检查 是否是 Foo 的实例(但不是其 foo 子类的实例)?那是: checkInstance(qux,Foo.class)=true checkInstance(qux,Bar.class)=false 有没有类似于< code>instanceof的语句来进行这种检查?或者我应该使用< code>qux.getClass()。equals(Foo.class)

  • 问题内容: 当我打字 是物体吗? 谁能向我解释在Java中每件事都是一个对象吗? 问题答案: 每个对象都是(注意:没有超类。;)) 但是,有很多东西不是对象。 原语和引用。 字段(字段本身不是内容) 局部变量和参数。 通用类(在Java 8中可能会更改) 方法(将在Java 8中更改) 代码块(将在Java 8中更改) 将代码块作为对象是Java 8中最令人兴奋的功能之一。下面的示例都是Closu

  • 问题内容: 我在另一个Stack Overflow问题上读到,Python就像Ruby一样,因为它涉及到“一切都是对象”,而Python中的一切都是对象,就像Ruby一样。 这是真的?Python中的所有对象都是像Ruby这样的对象吗? 两者在这方面有何不同?或者它们真的相同吗?例如,您能拿一个数字来做我所看到的Ruby吗: 可以在Python中以相同的方式完成吗? 问题答案: DiveIntoP

  • 问题内容: 在我目前正在从事的一个项目中,我遇到了一个角度异常: 在寻找解决方案的搜索中,我直接在浏览器中输入了Web服务的URL,但令人惊讶的是,我没有收到预期的数组。 Web服务类: 当我输入网址时,我希望看到带有JSON对象的JSON数组: 但是,相反,我收到的JSON对象的属性与我期望的JSON对象相同,没有任何数组: 所以我想知道为什么没有数组,当我添加另一个Clazz对象时会发生什么。

  • 我使用的是sequelize ORM,而对于DB我使用的是MySQL,在其中我关联了两个表并获得了数据,但我希望第二个数据(另一个表的数据)不应该像嵌套对象一样进来,而是我们可以在一个对象中显示所有数据(两个表的数据)。 让我展示一下屏幕快照。 我想要的东西。 忽略数据的键和值,但我的问题是,我们是否可以在同一对象中显示另一个表的数据(像inner join一样),而不是像嵌套对象中的数据。 任何