什么“!”运算符在javascript中与非布尔变量一起使用时的意思?

时间:2011-08-09 16:07:32

标签: javascript operators

在阅读javascript代码时,我一直看到用于非布尔变量的!运算符。以下是未使用的代码示例。

/**
 * loads a resource from a url
 * @param {string} url the url of the resource to load
 * @param {string} relativeTo the url to load relative to
 * @param {function} callback thefunction to call once the file is loaded
 * @private
 */
 GLGE.Wavefront.prototype.loadFile=function(url,relativeTo,callback){
    if(this.relativeTo && !relativeTo) relativeTo=this.relativeTo; //<-- used on a string?
    else this.relativeTo=url;
    if(!callback) callback=this.loaded;    //<-- used on a function?
    var req = new XMLHttpRequest();
    if(req) {
               // request handling code                
            }
        };
        req.open("GET", url, true);
        req.send("");
    }   
}

在这个库中,我以这种方式看到了这种运算符的许多用途。

有人可以解释当字符串,对象或函数的'not'函数不是像集合那样的布尔集的一半时,是否可以确定它是什么? truefalse

5 个答案:

答案 0 :(得分:14)

任何虚假值都将满足if(!insert_variable_here)条件,包括:

  • false
  • null
  • undefined
  • 空字符串''
  • 数字0
  • NaN

如果callback返回计算任何这些值,则满足条件。

即使null != false,以下内容也会提醒您:

x = null;
if(!x) {
    alert('"!null" does evaluate to true');
}

无论null != false是否对您或其他任何人有意义,重点是JavaScript中null是一个假值,因此是一个满足我第一位条件的值上面列出的代码。这似乎是您提出的问题 - 而不是null应该或不应该== false

答案 1 :(得分:9)

在JavaScript中,一元否定运算符(!)将基于该语言的(有点令人困惑的)规则(例如,ECMA-262第5版)将其操作数转换为布尔值。 This article on JavaScript syntax显示了类型转换如何发生的一些示例。

基本上,这是一种测试非“真实性”的简单方法;看似错误的值(例如falsenull0NaN,空字符串等)在被逻辑否定之前将被转换为false,反之亦然。您可以使用布尔构造函数显式测试“真实性”:

Boolean(null); // => false
Boolean(NaN); // => false
Boolean(""); // => false
Boolean(0); // => false
Boolean(1); // = >true
Boolean("123"); // => true
Boolean(new Object()); // => true
Boolean(function(){}); // => true

答案 2 :(得分:3)

!object
当对象未定义时,

将返回false,等于null或0,否则返回true。

答案 3 :(得分:1)

每个变量和对象都可以等同于truefalse。在对象的情况下,undefined是false,其他任何都是真的。

这实际上提供了一些有趣的边缘情况http://www.ejball.com/EdAtWork/2005/02/15/JavaScriptWhatIsTrue.aspx

有点让我感到震惊null != false评估为true

<强>更新

请注意,所有在评论中抨击我的人都会将ECMAScript specification放在第43页上,将null的toBoolean转换定义为false。由于我们仅使用==而未对===进行类型检查,因此我发现我希望null == false评估为true非常合理。

该规范于今年6月发布,所以这可能是一个变化,但在本次辩论中,规范作者似乎对我不屑一顾。

答案 4 :(得分:-2)

这意味着没有或错误。

它只是一个替代:

if (callback != null)
{
     //callback is not null
}

if (callback)
{
    //callback is not null
}

OR

if (this.relativeTo && relativeTo == false)
{
    //some code
}