【发布时间】:2018-02-07 09:56:58
【问题描述】:
如果var a = true 那么a == 1 是true 但a == 2 是false。为什么?我知道在 javascript 布尔表达式中,0 转换为 false,1 转换为 true。但是其他整数呢。为什么会出现上述行为?
【问题讨论】:
-
所有非零值都不为假,但
true不能是任何非零值,它必须是单个值。
标签: javascript
如果var a = true 那么a == 1 是true 但a == 2 是false。为什么?我知道在 javascript 布尔表达式中,0 转换为 false,1 转换为 true。但是其他整数呢。为什么会出现上述行为?
【问题讨论】:
true不能是任何非零值,它必须是单个值。
标签: javascript
为什么?我知道在 javascript 布尔表达式中 0 强制转换为 false 和 1 转换为 true。
因为Number(true) => 1
根据spec of abstract equality expression evaluation
- 如果 Type(x) 是 Boolean,则返回比较结果 ToNumber(x) == y。
因此a首先被强制转换为数字,然后与 1 进行比较。
【讨论】:
在js中使用==或!=时,操作数会先转换为相同类型再进行比较。转换时:
如果有布尔值,则true转为1,false转为0;
var a = true;
a == 1;// a turned to 1 before compare,so true
a == 2;// a turned to 1 before compare,so false
【讨论】:
这与强制有关。在a == 1 场景中,a 被强制转换为整数以再次比较 1,true 被强制转换为 1。在第二个示例中,a 再次被强制转换为 1,因此它不等于 2。
【讨论】:
您可以将1 转换为True 和True 转换为1,但您不能将其他数字转换为True。
【讨论】:
这可能是从二进制世界继承而来的,这是有道理的,因为在二进制中,0 为假,1 为真。没错,这就是 javascript 在比较时对布尔类型进行类型转换的方式。
对于布尔值,只有两种可能,true 或 false。因此,在数字/二进制系统中,0 和 1 很容易代表它们。
【讨论】:
好吧,因为 0 = 假,1 = 真。布尔值只有两个值:真/假。那么 2 应该是什么?
var 没有类型,它可以是一切。另请考虑 == 与 === 运算符。
var x = 1;
console.log(x === true);
console.log(x == true);
x = 2;
console.log(x === true);
console.log(x == true);
x = 0;
console.log(x === false);
console.log(x == false);
x = -1;
【讨论】: