基于以下规则:
虚假:
真正的:其他一切
在以下测试中,为什么只有数字1评估为“真”,所以我找不到正确的解释
0 == true ("false")
1 == true ("true")
2 == true ("false")
othernumber == true ("false")
答案 0 :(得分:3)
“真实”和“虚假”规则仅在将值本身用作测试时才适用,例如:
var str = "";
if (str) {
// It's truthy
} else {
// It's falsy
}
==
有其自己的不同规则集,用于确定其操作数的松散相等性,在规范的Abstract Equality Comparison algorithm中有详细解释:
- 如果Type(x)与Type(y)相同,则
- 返回执行严格相等比较x === y的结果。
- 如果x为null且y未定义,则返回true。
- 如果x未定义且y为空,则返回true。
- 如果Type(x)为Number而Type(y)为String,则返回比较结果x == ToNumber(y)。
- 如果Type(x)为String,Type(y)为Number,则返回比较结果ToNumber(x)== y。
- 如果Type(x)为布尔型,则返回比较结果ToNumber(x)== y。
- 如果Type(y)为布尔型,则返回比较结果x == ToNumber(y)。
- 如果Type(x)是字符串,数字或符号,而Type(y)是Object,则返回比较结果x == ToPrimitive(y)。
- 如果Type(x)是Object并且Type(y)是String,Number或Symbol,则返回比较结果ToPrimitive(x)== y。
- 返回false。
请参阅规范以获取其中列出的各种抽象操作的完整详细信息,尽管名称几乎说明了它们的作用。 (如果您查看规范,则会在!
之前的各个地方看到ToNumber
;在上面已将其删除。它是 not 逻辑NOT运算符,它是a spec notation related to "abrupt completions.")
下面以您的2 == true
示例为例:
但是请注意,您的1 == true
示例的第7步是不同的:
答案 1 :(得分:2)
根据this book,这是一个非常有趣的原因,当您将任何内容与布尔值进行比较时,例如在x == y
中,它遵循以下模式:
如果Type(x)为布尔型,则返回比较结果ToNumber(x)== y。
如果Type(y)为布尔型,则返回比较结果x == ToNumber(y)。
因此,当您比较1 == true
时,实际上是在做1 == ToNumber(true)
,然后变成1 == 1
,但是当您进行2 == true
时,它变成了2 == 1
当然是错误的。
这和书中给出的其他一些原因建议不要将事物与布尔值进行比较。
与布尔值进行比较时,值本身是真还是虚假都没有关系,因为它永远不会转变为布尔值,但是布尔值会强制转换为可以与另一个值进行比较的类型==
运算符的侧面。
希望您对此答案感到满意。
答案 2 :(得分:0)
使用==
与if(something)
不同
该测试将为您提供预期的结果:
function truthyFalsyTest()
{
if(0)
{
console.log("true");
}
else
{
console.log("false");
}
if(1)
{
console.log("true");
}
else
{
console.log("false");
}
if(2)
{
console.log("true");
}
else
{
console.log("false");
}
if(2222)
{
console.log("true");
}
else
{
console.log("false");
}
}
truthyFalsyTest();
答案 3 :(得分:0)
在JavaScript(==)中,是用于完成类型转换的相等运算符。更为严格的(===)身份运算符将不会进行类型转换。
例如,即使数字不是布尔值,也可以使用数字值,如果使用(==)运算符,则期望布尔值。
但是,如果强制使用更严格的(===)运算符,则会看到'1 === true'的计算结果为false。
答案 4 :(得分:0)
Based on these rules:
这里的问题是==
不受这些规则约束。事物是否真实以及在相等性测试期间的行为是两个不同的问题。根据记录,对真实性的更正确测试将是
if (value)
return true;
else
return false;
或更短-直接转换Boolean(value)
(和隐式转换!!value
。
但是,在相等性测试期间,==
的两侧将转换为相同的基本类型,然后然后进行实际测试。 MDN has a list of rules for the conversion-直接从
1 == true
使用数字和布尔值,因此两者的基本类型都是 number 。 JS解析器将执行ToNumber(booleanValue)
,因此这是相等测试实际测试的
var convertedBooleanOperand = Number(true);
console.log("convertedBooleanOperand", convertedBooleanOperand);
实际上,2 == true
被转换为2 == 1
的{{1}}。
答案 5 :(得分:0)
0为假,并不意味着othernumber将为true。 简单的例子。如果在条件中使用===,则所有数字都将为假。
(0 == true) // false
(1 == true) // true
工作正常。但是,在下面的示例中,我没有在条件中不使用运算符(!)。因此,如果条件为true,则应打印true,否则为false。 仍然会给您相反的结果。
if(0){console.log("true")}else{console.log("false")} // false
if(1){console.log("true")}else{console.log("false")} // true
if(15){console.log("true")}else{console.log("false")} // true
现在,如果将数字转换为布尔值,那么它将给出您所想的结果。
Boolean(0) == true // false
Boolean(1) == true // true
Boolean(2) == true // true
Boolean(othernumber) == true // true
谢谢