在阅读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'函数不是像集合那样的布尔集的一半时,是否可以确定它是什么? true
和false
?
答案 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显示了类型转换如何发生的一些示例。
基本上,这是一种测试非“真实性”的简单方法;看似错误的值(例如false
,null
,0
,NaN
,空字符串等)在被逻辑否定之前将被转换为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)
每个变量和对象都可以等同于true
或false
。在对象的情况下,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
}