如果(值=== true)不起作用

时间:2016-12-24 18:29:19

标签: javascript

有人可以向我解释为什么这不起作用?值为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");

3 个答案:

答案 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²)