本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
What is the !! (not not) operator in JavaScript?
What does the !! operator (double exclamation point) mean in JavaScript?
所以我调试了一些代码并遇到了这个问题:
var foo.bar = 0; // this is actually passed from another function, adding it for context
function(foo) {
var someVar = !!foo.bar;
if (foo.bar) {
// ..stuff happens
} else {
// .. something else happens
}
}
好吧,我的问题是,!!的意义是什么?现在所做的一切都是制造江户X(1)。
与boolean(foo.bar)相比,使用它有什么好处吗?
foo.bar可以在if-as-is中进行评估,因为0 === false已经存在,那么为什么要进行转换呢?(somevar不能在其他任何地方重复使用)
好吧,我知道它是什么,我只是想知道在你的关联问题中没有解释的好处是什么。
0==false不是0===false,三等号阻止了内隐的投射尝试。
这会将值转换为布尔值并确保布尔类型。
"foo" // Evaluates to"foo".
!"foo" // Evaluates to false.
!!"foo" // Evaluates to true.
如果通过foo.bar,那么它可能不是0,而是其他一些不稳定的值。见下表:
javascript的真值表
'' == '0' // false
0 == '' // true
0 == '0' // true
false == 'false' // false
false == '0' // true
false == undefined // false
false == null // false
null == undefined // true
" \t
" == 0 // true
Source: Doug Crockford
当涉及到NaN值时,JavaScript也会变得非常奇怪。这是我能想到的唯一一个例子,在我的头顶上!!的行为与===不同。
NaN === NaN //false
!!NaN === !!NaN //true
// !!NaN is false
这并不能回答问题。问题问:"foo.bar可以在if-as-is中进行评估,因为0==false已经存在,所以为什么要进行转换?"您的答案解释了它确保了布尔类型,但是OP已经知道了;问题是,确保布尔类型的意义是什么?
@if语句是隐式的,不会使用===
对不起,你能详细解释一下你最后的评论吗?因为我真的不明白它到底想说什么。- -
@鲁克,我明白这是怎么回事。我试着将代码与op发布的if foo.bar联系起来,但是除了偏好之外,我可以推测的唯一原因是在处理nan时。我已将此编辑成我的答案。
我认为答案是没有什么意义。我们可以推测它是如何产生的:
可能早期版本的函数在多个地方使用了someVar,或者以真正受益于true或false的方式使用,所以这更合理。
也许编写函数的人习惯于使用!!转换为true或false,他甚至没有注意到这里没有必要。
也许编写函数的人认为,每一个计算(在本例中是布尔转换)都应该通过为其结果分配一些变量来赋予一个有意义的名称。
也许,因为javascript中的布尔转换非常容易出错(例如,new Boolean(false)是一个真正的值),所以编写函数的人认为应该始终显式地进行转换,而不是隐式地进行转换,即使效果是相同的,只是为了引起人们的注意,将其作为一个潜在的错误点。
当然,这是假定编写函数的人认为!!是一个"显式"布尔转换。从技术上讲,它并不像if那样使用隐式布尔转换,但如果您习惯了这种习惯用法,那么它就相当于显式转换。
但在我的主观看法中,这些理由都不是很好的理由!
这一点尤其重要,使我更喜欢这个答案;(例如,新布尔值(false)是一个真值)
我认为这比公认的答案更好,因为它实际上解释了为什么双感叹号可能被用作操作请求,而不仅仅是解释它的作用。我认为这将有助于说明这一点!!给您一个布尔值,而new boolean()给您一个布尔对象。
如上所述,它强制使用布尔类型的对象。你可以自己看到:
(function typecheck() {
var a ="a";
var b = !a;
var c = !!a;
alert("var a =" + typeof(a) +"
" +
"var b =" + typeof(b) +"
" +
"var c =" + typeof(c));
})();
如果您只是进行比较,转换只会在以后保存类型强制。
仅供参考,以下值在javascript中被强制为false:
假
零
"
无效的
未定义
"胁迫为假"是指如果我这样做:像var b = (nullthing) ? 'sad' : 'happy'这样的东西,如果nullthing是0、空、未定义的空白或假,我能可靠地得到b='快乐'?我可以发誓我遇到了一些问题,抱怨在这种情况下它是未定义的或空的。
比较规则有点奇怪。下面是一个很好的深入解释。在您给出的示例中,您将得到一个引用错误,这是正确的。