Javascript 如何解释(文档)0[]

Javascript 如何解释(文档)0[],javascript,Javascript,我看到了这样一个代码片段: with(document)0[(getElementsByTagName('head')[0] || body).appendChild(createElement(xxx))] document.getElementsByTagName('head')[0] || document.body.appendChild(createElement(xxx)) 我不知道如何理解(document)0[]的这是无效的JavaScript语法,试着理解一下,语义非常不清

我看到了这样一个代码片段:

with(document)0[(getElementsByTagName('head')[0] || body).appendChild(createElement(xxx))]
document.getElementsByTagName('head')[0] || document.body.appendChild(createElement(xxx))

我不知道如何理解(document)0[]的

这是无效的JavaScript语法,试着理解一下,语义非常不清楚

我想作者的意思是这样的:

with(document)0[(getElementsByTagName('head')[0] || body).appendChild(createElement(xxx))]
document.getElementsByTagName('head')[0] || document.body.appendChild(createElement(xxx))

“如果文档中有任何
标记,请返回第一个。否则,请返回将
createElement(xxx)
附加到正文中的结果。”

如果没有完整的代码,很难回答此问题。但我会在这里做一些假设

我想说的第一件事是避免使用
with()
语句。不建议在ECMAScript 5中使用,并且在
严格模式下禁止使用。其中一个原因是你的片段——这段代码让很多人感到困惑,甚至是你

让我们重写一下,让它更容易理解:

with(document) {
    0[(getElementsByTagName('head')[0] || body).appendChild(createElement(xxx))];
}
的工作原理您可以在这里阅读-,但基本上,它让我们能够直接使用表达式的所有属性和方法,我们将使用
发送到
(在我们的例子中,它是一个
文档

那么,如果没有
,这个代码片段会是什么样子呢

0[(document.getElementsByTagName('head')[0] || document.body).appendChild(document.createElement(xxx))];
我唯一没有的答案是——为什么要在括号内执行这段代码?我的假设如下:


此代码片段
(document.getElementsByTagName('head')[0]| | document.body).appendChild(document.createElement(xxx))
将返回新创建元素的节点。但是如果我们将此代码放入
0[]
,它将返回
undefined
,因为没有这样的属性。同样,如果没有完整的图片,很难理解此代码片段的所有部分。

(文档)0
在控制台中给出错误:/这应该是一个解析错误。你在哪里发现的?!我并不惊讶你不理解它-这是胡说八道。我不确定,但在编辑之前,代码前面有
。这是否意味着类似于typescript?“(document)0[(getElementsByTagName('head')[0]| | body.).appendChild(createElement('script')).src='Date()/36e5)];”这是源代码,运行良好;我知道可以改变范围;但是0如何解释是的,这段代码应该运行良好,编写正确。我不知道js中有什么“后台魔术”可以在这个代码片段中使用
0[]
。对我来说,唯一合乎逻辑的解释是这个片段中的返回值。因此,在执行内部表达式之后,它将返回src,因此代码将如下所示:
with(document)0[“http://..."];。要处理此问题,JS引擎将执行
新编号(0)
并搜索“http://...属性,并返回未定义的
。因此,由于
0[]
wrapper,此代码片段将返回
undefined
,而不是
http://...
谢谢您的回答;但我认为这没有意义,因为没有变量来保存返回值