有人可以向我解释为什么这不起作用?值为true,它是布尔值,如果我检查它就像我通常做if(value){};有用。为什么不喜欢这个?
function updateRecords(value) {
console.log(!!(value)); // true
console.log(typeof(!!(value))); //boolean
if (value === true) {
alert("success");
}
}
updateRecords("Take a Chance on Me");
答案 0 :(得分:10)
您正在使用的值是字符串,而不是布尔值。当你写这个:
console.log(!!(value));
您将字符串值转换为布尔值,但您没有捕获它。你转换它并记录它然后它被扔掉了。然后你的下一行:
console.log(typeof(value)); // string NOT Boolean
回去测试value
(字符串)的原始值。
三等号检查"类型和值相等",因此您的if
测试失败。
现在,如果您删除其中一个等号(==
)并使用类型转换"来测试简单"值相等,除非您是文本,否则它仍然无法工作针对转换为与true
相同的数字进行测试(请参阅下面的链接了解详细信息),但这不会发生,您的字符串将转换为NaN
(不是数字)和true
将转换为1
,因此即使value == true
也会失败。
您可以看到有关等式和类型转换如何协同工作的更多详细信息 here 。
无论如何,在这种情况下,不要对布尔true
进行测试,只测试数据的存在:if(value)
并不会尝试将您的值转换为a number
,它会尝试将其转换为布尔值。只要您没有包含"falsy"值的字符串(例如。""
,"0"
,"false"
," "
),它就会转换为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");

答案 1 :(得分:2)
因为你还没有在第二个实例中进行类型转换。
if (!!(value) === true) {
alert("success");
}
以前你在检查:
"Take a Chance on Me" === true // This obviously returns false.
以上应该有效。否则,您不应该使用===
运算符。您应该使用==
:
if (value == true) {
alert("success");
}
答案 2 :(得分: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²)