我正在阅读一本关于JavaScript的好书。
它起始于:
布尔类型只有两个字面值:true和false。它们与数字值不同,所以true不等于1,false不等于0。
但是,我注意到以下内容:
if(1==true)
document.write("oh!!! that's true"); //**this is displayed**
我知道,在JavaScript中每种类型都有一个对应的布尔值。
但是,真相是什么呢?
我正在阅读一本关于JavaScript的好书。
它起始于:
布尔类型只有两个字面值:true和false。它们与数字值不同,所以true不等于1,false不等于0。
但是,我注意到以下内容:
if(1==true)
document.write("oh!!! that's true"); //**this is displayed**
我知道,在JavaScript中每种类型都有一个对应的布尔值。
但是,真相是什么呢?
在Javascript中,true
和false
并不代表数字值。
在一些其他的编程语言中(如C、VB),布尔值被定义为实际的数字值,所以它们只是1和0(或-1和0)的不同名称。
在其他一些编程语言中(如Pascal、C#),有一个不是数值类型的独立布尔类型。虽然可以在布尔值和数值之间进行转换,但不会自动发生转换。
Javascript属于具有独立布尔类型的类别,但另一方面,Javascript非常善于在不同数据类型之间转换值。
例如,即使数字不是布尔类型,也可以在期望布尔值的地方使用数字值。像if (1) {...}
这样的代码与if (true) {...}
一样有效。
在比较值时,就像在你的示例中一样,等号(==
)运算符和全等号(===
)运算符之间存在差异。等号(==
)运算符会快乐地转换类型以找到匹配,因此1 == true
计算结果为true,因为true
被转换为1
。全等号(===
)类型运算符不进行类型转换,因此1 === true
计算结果为false,因为值的类型不同。
1
这样的数字确实被转换为 true
进行比较,那么为什么 2 == true
也不会评估为 true 呢?为了证明当转换为布尔值时 2
也被视为 true
,!!2 == true
的结果为 true。 - user193130true
被转换为 1
,所以 1 == true
的结果为 true,而 2 == true
的结果为 false。当你将一个值用作条件时,转换必须是布尔类型,因为这是条件可以使用的唯一类型。 - Guffa+true === 1
,结果为真。 - user193130indexOf
方法并不适合那样使用。即使将-1
解释为false
,如果字符串在第一个位置找到它仍然行不通。由于indexOf
如果在第一个位置找到字符串则返回 0
,所以它也会被解释为 false
。你可以使用 if(str.indexOf("something") + 1)
,但这太晦涩了,最好还是使用 if(str.indexOf("something") != -1)
查找特殊值 -1
。 - Guffaif (array.length)
而是使用 if (array.length > 0)
,那么你就是一个糟糕的程序员。 - Hal50000在JavaScript中,==被称为“大概等于”。
我所指的是JavaScript会自动将布尔值转换为整数,然后尝试比较两个值。
如果想要进行真正的相等性比较,请使用===运算符。
==
检查的被称为“IsLooselyEqual”。 - IMm0rtal尝试使用严格相等比较:
if(1 === true)
document.write("oh!!! that's true"); //**this is not displayed**
==
运算符会进行类型转换,而 ===
运算符不会。
比较x == y,其中x和y是值,会产生true或false。此类比较按以下方式执行:
因此,在if (1 == true)
中,true
被强制转换为Number
,即Number(true)
,其结果为1
,最终得到的是if (1 == 1)
,其结果为true
。
if (0 == false)
的逻辑完全相同,因为Number(false) == 0
。
如果使用严格相等运算符===
,则不会发生这种情况:
比较 x === y,其中 x 和 y 是值,结果为 true 或 false。该比较按照以下步骤执行:
- 如果 Type(x) 与 Type(y) 不同,则返回 false。
0 == ''
当将某个变量与布尔值进行比较时,会按照以下方式进行:
步骤1:将 boolean
转换为数字类型。例如:Number(true) // 1
和 Number(false) // 0
步骤2:比较两侧的值。
boolean == someting
-> Number(boolean) === someting
如果将1
和2
与true
进行比较,您将得到以下结果
true == 1
-> Number(true) === 1
-> 1 === 1
-> true
true == 2
-> Number(true) === 1
-> 1 === 2
-> false
var fred = !!3; // will set fred to true
var joe = !!0; // will set joe to false
alert("fred = "+ fred + ", joe = "+ joe);
并不是所有 JavaScript 的东西都很好懂 ;)
使用===
来比较变量,而不是使用==
。
==
检查变量的值是否相似
===
检查变量的值和类型是否相似
注意
if(0===false) {
document.write("oh!!! that's true");
}
和
if(0==false) {
document.write("oh!!! that's true");
}
给出不同的结果
在Chrome控制台中尝试这些示例:
> 2==true
false
> 1==true
true
> true + 1
2
> true + 2
3
> true + true
2
所以,答案是:
是的,只要您在任何算术上下文中使用true
,它就被视为数字1,或者像李小龙所说的那样,它变成了1。同样地,false实际上是零。但是,
不是的,如果您问Javascript它对true
的看法,它会说它是一个布尔值:
> typeof true
'boolean'
true
添加到一个字符串中,它不会添加1
,而是作为一个字符串添加"true"
,因此从根本上讲,它绝不等同于一个数字。让我用一个可怕的双关语来结束这篇文章:
true不是一个数字 - 但它看起来像一个数字
使用 == 时,您基本上是比较变量在与 false 比较时是否为 falsey,在与 true 比较时是否为 truthy。如果使用 ===,它将比较变量的确切值,因此 true 将不等于 1