JavaScript奇怪的null行为

时间:2012-01-27 23:12:03

标签: javascript null

我非常了解undefined和null之间的区别以及JavaScript将任何内容强制转换为布尔值的事实,特别是null为false。

我的问题是:为什么FF 9和IE 9都会触发第二个警报? (这是一个基于更复杂脚本的小型测试脚本。它仅用于说明问题......)

我期待着。运算符优先级和表达式返回null,然后将其转换为布尔值false。添加括号,!(context.isNull)没有区别。

<!DOCTYPE html>  
<html lang="en">  
  <head>  
    <title>Test</title>  
  </head>  

  <body>  
    <script type="text/javascript">  
        var context = this;  
        var isNull = null;  

        var aFunc = function() {  
            alert(context.isNull);  
            if (!context.isNull) {  
                alert("Is !context.isNull really true?");  
            }  
        };  

        aFunc();  

    </script>  
  </body>  
</html>  

7 个答案:

答案 0 :(得分:1)

context.isNull this.isNullwindow.isNullnull,布尔值为false。然后,您添加!,将其反转,从而产生整体true表达式,从而评估您的if正文。

答案 1 :(得分:0)

编辑:我错过了上下文=此部分..正如其他提到的,context = this =&gt; context = window。

另外,var isNull = null;在全球范围内暗示=&gt; window.isNull = null。

将是,

if (!context.isNull) => if (!window.isNull) => 
                          if (!null) => if (!false) => if(true)

if(!context.isNull)=&gt; if(!undefined)=&gt; if(!false)=&gt;如果(真)

答案 2 :(得分:0)

因为this.isNull会评估为null!null是真实的。

答案 3 :(得分:0)

我认为您期望!null成为null?这是有道理的 - 在SQL中使用了那种three-valued logic - 但这不是它在JavaScript中的工作方式。在JavaScript中,!强制将其参数解释为布尔值,如您所知,null在被解释为布尔值时变为false

答案 4 :(得分:0)

当置于布尔上下文中时,null值将评估为falseunary negation运算符!null转换为布尔值 - false - 然后将布尔值布尔值转换为其相反的值:{{1} }。所以true做了两件事 - 它是演员和翻转。

答案 5 :(得分:0)

isNull是一个局部变量。它不是当前由“this”表示的对象的属性,如果你添加this.isNull = null或context.isNull = null,你将获得你想要的东西。

我认为他得到了一个真实的结果,因为context.isNull未定义,因为undefined被视为错误的结果反转它

考虑到这也会产生警报:

    var aFunc = function() {  
        alert(context.isNull);  
        if (!context.foo) {  
            alert("Is !context.isNull really true?");  
        }  
    };  

答案 6 :(得分:0)

首先,“谢谢!”对每个回复的人。

我很尴尬。在漫长的一天中,这是星期五晚上,我颠倒了我脑海中的逻辑。它正在做它应该做的事情。问题是实际的代码正在检查现有的东西,我向后编写了我的测试用例。

如果将null转换为false,则返回false,false为true,因此执行“if”代码。我(脑死亡)选择的字段名称掩盖了这个问题。

原因

var context = this;

是真正的代码位于构造函数中。然后,在创建函数时“关闭”字段“上下文”,这保留对正在构造的对象的引用。当函数附加到另一个对象(通常作为事件处理程序)时,这很重要,这样函数体就可以访问原始对象的内容。当然,在这个例子中,“this”指的是全局对象,它没有多大用处。