为什么!document.body返回False?

时间:2017-04-17 20:28:11

标签: jquery html5

我一直在关注source code for JQuery,并试图了解他们的情况:
$(document).ready()
功能有效。

在第407行,我发现了这一部分:
if ( !document.body ) {
哪个接缝是确定文件是否加载的关键。

我想知道的是什么:
为什么:
!document.body
返回False

,同时:
document.body
返回:[object HTMLBodyElement]
You can try it here只需删除第一个:.innerHTML

(经过一个小时的搜索和阅读后,我无法找到适当的答案,所以现在我希望这里有一些专业人士可以帮助我,谢谢!)

编辑:是的我知道!document.body来自JavaScript而不是JQuery,最后JQuery是使用JavaScript代码构建的。

3 个答案:

答案 0 :(得分:1)

你所问的与jQuery无关。它实际上是Javascript:

如果正文被加载,

document.body总是返回true。所以!document.body意味着如果身体还没有加载,那么就采取一些行动。

根据文档(https://developer.mozilla.org/en-US/docs/Web/API/Document/body),该属性适用于大多数浏览器的早期版本

enter image description here

答案 1 :(得分:1)

我想我已经明白发生了什么以及我误解了什么 我最初只期望2种不同的状态(真/假),但事实上有4种不同的状态,如下表所示:

| Page loading state    |       document.body       | !document.body |
|=======================|===========================|================|
| Before page is loaded |            ?              | !false -> true |
|-----------------------|---------------------------|----------------|
| After page is loaded  | [object HTMLBodyElement]  | !true -> false |

我的错误是我只是在加载" -row后查看"并在true列中查看document.body

答案 2 :(得分:0)

基本上,因为类型转换。 !运算符执行从对象到布尔“true”值的类型转换,然后将其否定为“false”值。

正式来自ECMA-262 Ecmascript spec

  

12.5.9逻辑NOT运算符(!)#

Let expr be the result of evaluating UnaryExpression.
Let oldValue be ToBoolean(? GetValue(expr)).
If oldValue is true, return false.
Return true.

  

7.1.2 ToBoolean(参数)#

     

抽象操作ToBoolean将参数转换为type的值   根据表10的布尔值:表10:ToBoolean Conversions

Argument Type     Result 
Undefined     Return false. 
Null          Return false.
Boolean       Return argument. 
Number        Return false if argument is +0, -0, or NaN; otherwise return true. 
String        Return false if argument is the empty String (its length is zero); 
                      otherwise return true. 
Symbol        Return true. 
Object        Return true.