问题 什么让documentElement为0返回


大多数JavaScript库包含类似于的行:

    var b = (a ? a.ownerDocument || a: 0).documentElement;

如果 a 是 null, 什么是 (0).documentElement 应该回来?


3909
2017-09-11 13:36


起源



答案:


jQuery / Sizzle 注释:

http://jsapi.info/jquery/1.7.2/jQuery.isXMLDoc

对于尚不存在的情况,将验证documentElement   (例如在IE中加载iframe - #4833)

所以这只是回归的可爱语法 undefined  - 这是打电话的结果 documentElement 上 0

在下一行有检查:

return documentElement ? documentElement.nodeName !== "HTML" : false;

所以它无论如何都会返回false。


4
2017-09-11 13:44





最有可能的:未定义 还有什么?


4
2017-09-11 13:42





这是一个简写:

var b; // defaults to "undefined"
if (a) b = a.ownerDocument.documentElement || a.documentElement;

它正在检查是否已在DOM树中创建了DOM documentElement。 (0).documentElement访问一个不存在的属性,默认为undefined。如果未定义“documentElement”,则尚未创建它。

这可能更容易可视化:

a.ownerDocument.documentElement || // try this first
a.documentElement || // fallback
undefined; //documentElement has not been created yet

它不仅仅是“一个可爱的语法”,就像另一个建议的答案。它是“手动缩小”,因为在像JavaScript这样的动态类型语言中,缩小器无法确定“a”和“a.ownerDocument”可能属于同一类型,因此只能执行空白删除。

通过Closure Compiler运行我的上面的代码产生:

var b;a&&(b=a.documentElement||a.ownerDocument.documentElement);

同时,您在问题中呈现的“手动缩小”版本通过缩小器生成:

var b=(a?a.ownerDocument||a:0).documentElement;

结果:

Without manual minification (my code) + Closure minifier: 64 characters
With manual minification (your original code): 54 characters
With manual minification (your original code) + Closure minifier: 47 characters

2
2017-09-11 14:08





ownerDocument property返回html节点的document的所有者,作为文档对象。 html文档本身是元素的ownerDocument。如果它为null,我猜(0).documentElement在页面包含多个文档时返回初始文档。 ownerdocument可用于相应地在同一页面中的多个文档内创建html元素


0
2017-09-11 13:42



只是一个FYI, 0 没有 documentElement 属性。 - Rocket Hazmat
但是documentElement有 - Shadow


答案:


jQuery / Sizzle 注释:

http://jsapi.info/jquery/1.7.2/jQuery.isXMLDoc

对于尚不存在的情况,将验证documentElement   (例如在IE中加载iframe - #4833)

所以这只是回归的可爱语法 undefined  - 这是打电话的结果 documentElement 上 0

在下一行有检查:

return documentElement ? documentElement.nodeName !== "HTML" : false;

所以它无论如何都会返回false。


4
2017-09-11 13:44





最有可能的:未定义 还有什么?


4
2017-09-11 13:42





这是一个简写:

var b; // defaults to "undefined"
if (a) b = a.ownerDocument.documentElement || a.documentElement;

它正在检查是否已在DOM树中创建了DOM documentElement。 (0).documentElement访问一个不存在的属性,默认为undefined。如果未定义“documentElement”,则尚未创建它。

这可能更容易可视化:

a.ownerDocument.documentElement || // try this first
a.documentElement || // fallback
undefined; //documentElement has not been created yet

它不仅仅是“一个可爱的语法”,就像另一个建议的答案。它是“手动缩小”,因为在像JavaScript这样的动态类型语言中,缩小器无法确定“a”和“a.ownerDocument”可能属于同一类型,因此只能执行空白删除。

通过Closure Compiler运行我的上面的代码产生:

var b;a&&(b=a.documentElement||a.ownerDocument.documentElement);

同时,您在问题中呈现的“手动缩小”版本通过缩小器生成:

var b=(a?a.ownerDocument||a:0).documentElement;

结果:

Without manual minification (my code) + Closure minifier: 64 characters
With manual minification (your original code): 54 characters
With manual minification (your original code) + Closure minifier: 47 characters

2
2017-09-11 14:08





ownerDocument property返回html节点的document的所有者,作为文档对象。 html文档本身是元素的ownerDocument。如果它为null,我猜(0).documentElement在页面包含多个文档时返回初始文档。 ownerdocument可用于相应地在同一页面中的多个文档内创建html元素


0
2017-09-11 13:42



只是一个FYI, 0 没有 documentElement 属性。 - Rocket Hazmat
但是documentElement有 - Shadow