2

这是我第一次尝试编写 if 语句的速记,但是我对为什么扩展版本不能像我想象的那样工作感到困惑。

代码 1 - 不起作用

if(document.getElementById == true) {
        alert("The document object model is supported by: " + navigator.appName);   
    }

代码 2 - 有效

if(document.getElementById != false) {
            alert("The document object model is supported by: " + navigator.appName);   
        }

代码 3 - 有效的速记

 if(document.getElementById) {
            alert("The document object model is supported by: " + navigator.appName);   
        }

为什么如果我将 3 中的速记扩展到第一个代码示例不起作用,如果我让它等于 ,为什么它会起作用!= false

4

5 回答 5

2

你的第if一句话:

if(document.getElementById == true) {

...不起作用,因为document.getElementById它是一个函数,它是一种对象,并且一个对象不等于true.

你的第二个if陈述:

if(document.getElementById != false) {

...并没有真正起作用-即使您认为它确实起作用-因为(我假设)您仅在document.getElementById定义为的浏览器中对其进行了测试,在这种情况下,又.getElementById是一个函数,一种对象,不等于false但是,如果.getElementById没有定义,那么if 测试将有效地测试 if undefined != false which is also true。所以那个测试并没有像你想象的那样做。

你的第三个if陈述:

 if(document.getElementById) {

...确实有效。它起作用的原因是因为 JavaScript 具有“真”和“假”表达式的概念。数字 0、空字符串""undefinednullNaN,当然false都是“假”值。几乎所有其他内容,包括非零数字、非空字符串和任何对象(包括函数)都是“真实的”。如果语句中的表达式if是“truthy”,则将执行 if 块。

(最后,真的不需要测试是否document.getElementById存在——如果你能找到一个运行 JS 但没有定义该方法的浏览器,我会感到惊讶。)

于 2012-06-26T01:41:16.863 回答
1

因为document.getElementById是一个存在的函数,但不是true。尝试document.write(document.getElementById)并查看结果。true它也不会评估false

在此处查看实际操作。

您不必将其与布尔值进行比较,因此最好的做法是:

if(document.getElementById){
    //Do something
}
于 2012-06-26T01:00:09.580 回答
1

代码 1 是真实的,但不是真实的。getElementById 是一个对象,但它不是布尔值,因此将其与一个对象进行比较将是错误的。

这是一个解释真实性和虚假性概念的博客: http ://javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-javascript/

于 2012-06-26T01:02:24.533 回答
1

第一个不起作用,因为 typeofdocument.getElementById是 'function' 并且它的值是本机代码,而不是布尔值“true”。

关于。你的第三个例子,也试试这个:

if (!!document.getElementById) ...

!!将在结果上强制布尔类型。

于 2012-06-26T01:06:54.140 回答
0

这是来自 ECMAScript 规范的答案:

查看评估if语句的过程:在步骤 3 中,过程调用ToBoolean,它将对象转换为 value true。该ToBoolean函数是我们获得“真”和“假”值概念的地方;它们是分别由ToBooleanintotrue和转换的值false

现在看一下用于运算符的抽象相等比较操作==。的过程流Object == boolean比简单的调用要复杂得多ToBoolean。它是这样的:

For some comparison x == y...

1.  If Type(x) is different from Type(y), go to step 14.
19. If Type(y) is Boolean, return the result of the comparison x == ToNumber(y).

(Go back to step 1, with the boolean cast to a Number by ToNumber[1], then...)

21. If Type(x) is Object and Type(y) is either String or Number, return
    the result of the comparison ToPrimitive(x)== y.

(ToPrimative[2] calls the object's toString method; now compare String == Number)

17. If Type(x) is String and Type(y) is Number, return the result of the
    comparison ToNumber(x)== y.

(ToNumber turns the string "function()..." into NaN. Finally...)

5. If x is NaN, return false

更多参考资料:

[1]收件人编号

[2] ToPrimative调用[[DefaultValue]],这是一个相当长的。幸运的是,在这种情况下,它会在第 2 步中快速解决。

于 2012-06-26T03:12:08.907 回答