在JavaScript中为true==1和false==0
Is true == 1 and false == 0 in JavaScript?
我读了一本关于JavaScript的好书。
它始于:
布尔类型只接受两个文字值:true和false。这些值不同于数值,因此true不等于1,false不等于0。
然而,我观察到以下情况:
if(1==true)
document.write("oh!!! that's true"); //**this is displayed**
我知道,JavaScript中的每一种类型都有一个布尔等价物。
但是,事实是什么?
的确,true
和false
在Javascript中不代表任何数值。
在某些语言(例如C、VB)中,布尔值被定义为实际数值,因此它们只是1和0(或-1和0)的不同名称。
在其他一些语言(例如Pascal、C#)中,有一种不同的布尔类型不是数字类型。可以在布尔值和数值之间进行转换,但这不会自动发生。
Javascript属于具有不同布尔类型的类别,但另一方面,Javascript非常热衷于在不同的数据类型之间转换值。
例如,即使数字不是布尔值,也可以在需要布尔值的地方使用数值。使用if (1) {...}
和使用if (true) {...}
一样有效。
在比较值时,如您的示例中所示,==
运算符和===
运算符之间存在差异。==
相等运算符很乐意在类型之间进行转换以找到匹配,因此1 == true
的计算结果为true,因为true
转换为1
。===
类型相等运算符不进行类型转换,因此1 === true
的计算结果为false,因为值的类型不同。
在JavaScript中,==发音为"可能等于"。
我的意思是,JavaScript会自动将布尔值转换为整数,然后尝试比较两边。
对于真正的相等,请使用===运算符。
尝试严格的相等比较:
if(1 === true)
document.write("oh!!! that's true"); //**this is not displayed**
==
运算符执行从一种类型到另一种类型的转换,而===
运算符则不执行。
来自ECMAScript规范,章节11.9.3抽象等式比较算法:
比较x==y,其中x和y是值,产生true或false。这样的比较如下:
- 如果Type(y)为布尔值,则返回比较结果x=ToNumber(y)
因此,在if (1 == true)
中,true
被强制为Number
,即Number(true)
,这导致了1
的值,产生了最终的if (1 == 1)
,其为true
。
if (0 == false)
是完全相同的逻辑,因为Number(false) == 0
。
当您使用严格等于运算符===
时,这种情况不会发生:
11.9.6严格相等比较算法
比较x==y,其中x和y是值,产生true或false。这样的比较如下:
- 如果Type(x)与Type(y)不同,则返回false
啊,可怕的松散比较运算符再次出现。永远不要使用它。总是使用严格的比较,===或!===相反
额外的事实:0 == ''
当将某个东西与布尔值进行比较时,它的工作原理类似于以下
步骤1:将boolean
转换为Number
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
实际上,如果javascript中的每个对象都有W3Cschools所说的"实值",那么它就会解析为true。这意味着除了""
、NaN
、undefined
、null
或0
之外的所有对象。
用==
运算符对布尔值测试数字确实有点奇怪,因为布尔值在比较之前会转换为数字1,这稍微违背了定义背后的逻辑。当你做这样的事情时,这会变得更加令人困惑:
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");
}
给出不同的结果
在某种程度上,是的,它是1
在Chrome控制台中尝试以下示例:
> 2==true
false
> 1==true
true
> true + 1
2
> true + 2
3
> true + true
2
因此,答案是:
是,只要在任何算术上下文中使用
true
,它就会被视为数字1,或者正如李小龙所说,它就会变成1。同理,false实际上为零。但是,no,如果你问Javascript对
true
有什么看法,它会说它是一个布尔值:
> typeof true
'boolean'
在一种松散类型的语言中,有时事情不是它们的样子,而是你如何看待它们,这并不奇怪。如果将true
添加到字符串中,它将不会添加1
,而是添加"true"
作为字符串,因此归根结底,它决不等于一。让我用一个可怕的双关语结束这一切:
true不是一个数字,但它看起来像一个
==您本质上是在比较变量在与false比较时是false,还是在与true比较时是truthey。如果使用===,它将比较变量的确切值,因此true不会===1
- 如何在Bootstrap Modal中为动态点击生成的变量设置jade属性
- 在jquery中为显示/隐藏设置cookie
- 在phonegap中为android调用onload函数的最佳方式
- 未捕获的类型错误:无法读取属性'状态'在react中为null
- 在一个javascript文件中为整个网站创建标签
- 在Nodejs中为许多用户处理计时器
- 如何在ASP中为用户控件添加Javascript对象网
- 在BootStrap菜单栏中为所选项目设置背景,类似于BootStrap中的父导航选项
- 正则表达式,用于在 JavaScript 中为电话号码添加短划线
- 在JavaScript中为true==1和false==0
- 为什么(new RegExp(“w”)==/w/)在JS中为false
- 为什么{}=={}在JavaScript中为false
- autoDestroy的行为:在Extjs4中为false
- Boolean在Flash中为true,但在Javascript中为false
- 为什么在JavaScript中为false |(!!1)===1
- 字符串 '0' 在 javaScript 中为 true|false
- 在哪里添加可见性:在openlayers代码中为false
- 递归转换""在使用下划线的对象中为false
- data-stretch在同一视图中的地图和图表的剑道UI中为True/false
- 在if语句中为true, true返回false