[英]javascript truthy numbers
基于这些规则:
假的:
真相:其他一切
我找不到正确的解释,为什么在以下测试中,只有数字 1 评估为“真”
0 == true ("false")
1 == true ("true")
2 == true ("false")
othernumber == true ("false")
“true”和“falsy”规则仅在值本身被用作测试时才适用,例如:
var str = "";
if (str) {
// It's truthy
} else {
// It's falsy
}
==
有自己的、不同的、用于确定其操作数的松散相等性的一组规则,这些规则在规范的抽象相等性比较算法中进行了彻底的解释:
- 如果 Type(x) 与 Type(y) 相同,则
- 返回执行严格相等比较 x === y 的结果。
- 如果 x 为空且 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) 是 String、Number 或 Symbol 并且 Type(y) 是 Object,则返回比较结果 x == ToPrimitive(y)。
- 如果 Type(x) 是 Object 并且 Type(y) 是 String、Number 或 Symbol,则返回比较结果 ToPrimitive(x) == y。
- 返回假。
有关其中列出的各种抽象操作的完整详细信息,请参阅规范,尽管名称几乎说明了它们的作用。 (如果你查看规范,你会在不同地方看到ToNumber
之前的!
;我已经在上面删除了它。它不是逻辑 NOT 运算符,它是 与“突然完成”相关的规范符号。 )
让我们按照您的2 == true
示例进行操作:
但请注意,对于1 == true
示例,第 7 步是不同的:
这是一个非常有趣的原因,根据这本书,当您像正在做的那样将任何东西与布尔值进行比较时,例如在x == y
它遵循以下模式:
如果 Type(x) 是布尔值,则返回 ToNumber(x) == y 的比较结果。
如果 Type(y) 是布尔值,则返回比较结果 x == ToNumber(y)。
因此,当你比较1 == true
它实际上是在做1 == ToNumber(true)
然后变成1 == 1
,但是当你做2 == true
它变成2 == 1
这当然是假的。
这和书中给出的其他一些原因建议不要将事物与布尔值进行比较。
当您与布尔值进行比较时,值本身是真还是假并不重要,因为它永远不会变成布尔值,但布尔值被强制转换为可以与另一侧进行比较的类型==
运算符。
我希望你觉得这个答案令人满意。
using ==
不同于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();
在 JavaScript 中,(==) 是一个相等运算符,用于完成类型转换。 更严格的 (===) 标识运算符不会进行类型转换。
例如,即使数字不是布尔值,如果使用 (==) 运算符,您也可以在需要布尔值的地方使用数字值。
但是,如果您强制使用更严格的 (===) 运算符,您将看到 '1 === true' 的计算结果为 false。
基于这些规则:这里的问题是
==
不按这些规则运行。 某事是否为真以及它在相等性测试中的表现是两件不同的事情。 为了记录,对真实性的更正确测试将是
if (value)
return true;
else
return false;
甚至更短 - 直接转换Boolean(value)
(和隐式转换!!value
。
但是,在相等测试期间, ==
两边都将转换为相同的基本类型,然后进行实际测试。 MDN 有一个转换规则列表- 直接从它 a 1 == true
使用一个数字和一个布尔值,因此,两者的基本类型都是number 。 JavaScript 环境将通过调用ToNumber(booleanValue)
来解决这个问题,所以这里是相等测试实际测试的内容
var convertedBooleanOperand = Number(true); console.log("convertedBooleanOperand", convertedBooleanOperand);
实际上, 2 == true
被转换为2 == 1
,即false
。
0 是假的,这并不意味着 othernumber 将是真的.. 简单的例子。 如果您在条件中使用 === 那么您将看到所有数字的错误。
(0 == true) // false
(1 == true) // true
它工作正常。 但是,在下面的示例中,我没有在条件中使用 not 运算符 (!)。 因此,如果条件为真,则应打印真否则为假。 它仍然会给你相反的结果。
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
谢谢
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.