1

有人可以解释这里发生了什么吗?我正在尝试将此处描述!!的 javascript (double-bang) 运算符与HTML5 本地存储结合使用(我正在存储 0 和 1 值并测试真实性,但我还需要一个缺失的键为假,因此开始时未定义。

尽管在类型转换时它会在控制台中回显为 false,但它不在“if”语句中。

var foo = undefined;

// outputs undefined
console.log(foo)

// typecast to non-inverted boolean 
console.log(!!foo);

if (!!foo) {
    console.log("If was false before, why won't this execute?");
}​ else {
    console.log("It didn't work");
}​​​​​​​​​​​​​​​

产生:

undefined
false
It didn't work 

http://jsfiddle.net/YAAA7/
(Chrome v 23.0.1271.97 & Firefox 16.0.1, OS X 10.8.2)

编辑 - 更正的代码:

(之前的“if”语句只是评估为假,因此该分支永远不会运行。)

var foo = false;

// outputs undefined
console.log(foo)

// typecast to non-inverted boolean 
console.log(!!foo);

if (!!foo == false) {
    console.log("Matches for foo undefined, foo = 0 and foo = false");
} else {
    console.log("Matches for foo = 1 and foo = true");
}​

http://jsfiddle.net/YAAA7/1/

4

2 回答 2

5

这是预期的行为。如果你加倍不假,你就会假。这 , !l 是一个非运算符。这 , !!, 是两个非运算符。双非运算符有时用于转换为布尔类型。

! false === true
!! false === false
于 2012-12-17T19:08:06.650 回答
1
var foo = undefined;

foo将返回真。因为,在 JavaScript "" 中,undefined、0、NaN、false 和 null 被认为是错误值。

http://www.mapbender.org/JavaScript_pitfalls:_null,_false,_undefined,_NaN

从您的代码:

var foo = undefined; //false

console.log(!!foo); // !!foo = false;

if(!!foo) { //false
  console.log("It will not come because the condition fails");
}else{
    console.log("Else Part");
 }
于 2012-12-17T19:12:11.073 回答