2016-12-24 47 views
3

有人可以向我解释为什么这不起作用吗?值是真的,它是布尔值,如果我像通常那样检查它,如果(值){};有用。为什么不喜欢这个?如果(值===真)不起作用

function updateRecords(value) { 

    console.log(!!(value));  // true 
    console.log(typeof(!!(value))); //boolean 

    if (value === true) { 
     alert("success"); 
     } 
} 

    updateRecords("Take a Chance on Me"); 
+2

这不是一个布尔值。由于类型转换,您针对​​运行'typeof'的“东西”是一个布尔值。为了证明它,尝试记录“typeof(value)” – wally

回答

6

您使用的值是一个字符串,而不是布尔值。当你写这样的:

console.log(!!(value)); 

你是值转换为布尔值,但是你没有捕捉它。你转换它并记录下来,然后它就被扔掉了。那么你的下一行:

console.log(typeof(value)); // string NOT Boolean 

回到测试value(串)的原始值。

三重等号检查“类型和值相等”,因此您的if测试失败。

现在,如果您删除其中一个等号(==)并测试简单的“值类型转换”值,它仍然不会工作,除非您正在测试的文本转换为与true相同的数字(请参阅下面的链接了解详情),但这不会发生,您的字符串将转换为NaN(不是数字)并且true将转换为1,因此即使value == true也会失败

您可以看到更多关于平等和类型转换如何协同工作的详细信息。here

无论如何,在这种情况下,不测试对布尔true,只是测试数据的存在:if(value)不尝试将值转换为number,它试图将其转换为布尔。只要你没有一个空字符串或仅有空白字符的字符串,它会转换成true

function updateRecords(value) { 
 

 
    console.log(!!value);  // true 
 
    console.log(typeof value); // string 
 

 
    // Don't test against true (that's implied), just test the data. 
 
    if (value) { 
 
     alert("success"); 
 
    } 
 
} 
 

 
updateRecords("Take a Chance on Me");

或者,捕捉你的数据的铸造版本,然后您可以使用===

function updateRecords(value) { 
 
    // Convert the value of "value" to a Boolean and 
 
    // store that value back in the original variable 
 
    value = !!value; 
 

 
    // Now, let's test value AFTER capturing its converted value 
 
    console.log(value);   // true 
 
    console.log(typeof value); // boolean 
 

 
    if (value === true) { 
 
     alert("success"); 
 
     } 
 
} 
 

 
updateRecords("Take a Chance on Me");

+0

你忘了'==='! –

+1

明白了! ;) 哈哈! –

+0

我想过把它与double equals比较,它仍然没有工作。你能解释为什么吗?我的印象是,自从!!(“Take a Chance on me”)是真实的,并且这个字符串是真的,如果我将它与布尔值进行比较,它就会出现。 –

1

因为您还没有在第二种情况下进行类型转换。

if (!!(value) === true) { 
    alert("success"); 
} 

以前你检查:

"Take a Chance on Me" === true  // This obviously returns false. 

以上应该工作。否则你不应该使用===运营商。您应该使用==

if (value == true) { 
    alert("success"); 
} 
0

JS可奇怪的(@praveenkumar别名flashgordon:并不总是显而易见的):

"" == false is true 
"1" == false is false (ok so far) 
"0" == false is true (looks weird) 
" " == false is true (wtf...) 
"\n" == false is true (wtf²) 
+0

这是很好的信息,但对这个问题的答案不是很好。 –