Javascript 在JS中,if(condition)表示==真或==真

Javascript 在JS中,if(condition)表示==真或==真,javascript,css,Javascript,Css,我知道=和==之间的区别,但是我一直认为如果(条件)条件应该根据真使用严格相等(=)而不是类型强制相等(=)进行评估 请参见一个示例: if (1) { console.log("1"); } if (1 == true) { console.log("2"); } if (1 === true) { console.log("3"); } 它返回: ::1 ::2 我知道1不是严格地等于true,因为类型不同,但是当我按照W3C执行if(condition)时,

我知道
=
==
之间的区别,但是我一直认为
如果(条件)
条件
应该根据
使用严格相等(
=
)而不是类型强制相等(
=
)进行评估

请参见一个示例:

if (1) {
    console.log("1");
}

if (1 == true) {
    console.log("2");
}

if (1 === true) {
    console.log("3");
}
它返回:

::1
::2
我知道1不是严格地等于
true
,因为类型不同,但是当我按照W3C执行
if(condition)
时,应该执行严格的相等测试(
==
),而不是强制类型相等的
=


那么为什么要记录1呢?

它相当于ECMAScript语言规范指定的
条件==true
,3个等号表示“没有类型强制的相等”。使用三重相等,值的类型也必须相等


因为
=
是严格的比较运算符

if (1 === true) { //they are of a different type
你试过这个吗

if (0) {  // This fails
    console.log("1");
}
因为
0=off,否定,否,假。检查这个

而当您使用
==

if( 1 === true)  //It looks for type 1 as number and true as boolean


if
语句使用
条件==true
。它在ECMAScript语言规范中给出,如下所示:


注意步骤2中使用的
ToBoolean()
。这会将给定的参数转换为布尔值,这意味着在
if
语句的条件下,确实会发生类型强制。

Javascript a.k.a.ECMAScript不受W3C管辖,而是受ECMA管辖。你可以阅读说明书。您感兴趣的是第节,它指定如何处理
if
语句中的表达式。运行时应该调用表达式值上的
toBoolean
;这意味着任何类型都将转换为布尔值


因此,它的行为类似于
=

当您从一本关于CSS的书中获得此信息时,作者很可能引用如下CSS规则:

[if IE]body
{/* only for IE*/
    [if IE 6] background: url('get_real.gif');
    [if gt IE 6] background: url('nogood_browser.png');
}
[if Webkit]body
{/*Only webkit browsers get this bg*/
    background: url('webkit_bg.png');
}
[if Gecko]body
{/*Gecko-based browsers get this*/
   background: url('foxy.png');
}
除此之外-在JS上:

我猜你会明白的。求你了,为了你我的缘故

如果是
if(condition)
,其中
condition
应为
表达式
以确保正确,如果表达式由单个值组成,则应为真实值。在比较两个表达式的情况下,条件表达式的计算结果为
true
false
,具体取决于比较两个操作数的方式

单操作数:

if (1)//truthy
if (undefined) //falsy
这是因为
布尔值(1)==true
布尔值(未定义)==false

引入第二个操作数后:

if ('0' == 0)//=== true
if ('0' === 0)// === false
这是因为
==
是一种类型和值检查,您显然已经知道了。只是为了避免混淆:


如果您想确保您拥有正确的信息:请检查ECMAScript语言规范,而不是某些第三方资源:

Truthy:计算结果为TRUE的内容。 假的:评估为假的东西

1是真实的,0是虚假的

任何类型的对象(包括函数、数组)都是真实的

这些都是falsy:未定义、null、NaN、0、“(空字符串)和false

因此,在第一个条件中,
if(1)…
logs1,因为1是真实的


===专门测试类型相等性,这与测试truthy不同。

我在上的ECMA文档中找到了用于if语句的部分

总结如下:

Number:如果参数为+0,则结果为false,−0,或NaN; 否则,结果是正确的

注意:有一种将表达式转换为布尔值的简单方法,它使用!!操作人员例如
!!1是正确的
!!{}是真的
!!”“是假的,是假的!!“asdf”是正确的
因此,我总是很乐意将表达式转换为布尔值,然后将它们转换为if比较测试

if (1) { // !!1 is true and anything non-zero is true even -ve numbers just like c language
    console.log("1");
}

if (1 == true) { //!! 1 is true and we are not checking type only two equals (==)
    console.log("2");
}

if (1 === true) { //!! 1 is true but the type is number which is obviously not a Boolean type
    console.log("3");
}

请澄清当我根据W3C执行if(条件)时,它应该是===不==W3C在哪里指定?否,
if(1)
不应该是
if(1==真)
。那些
if(condition)
只会检查
condition
是否是真实值。你从哪里看到W3C说它是===?如果你说根据W3C,你会意识到W3C与JavaScript无关。JS的规范由ECMA维护。还请注意,W3C!==W3C学校,也不是W3C!=学校。。。你说得很对,但我认为你没有理解这个问题我也认为这个问题的答案不同。先生,你读过我的问题吗?当它说“我知道1不是===真的,因为类型不同”@VinitPrajapati:正如OP问题的本质一样:他没有混淆
==
==
之间的区别,但不确定如何理解
如果(条件)的陈述
仅当条件表达式
===true
时才为真,但如果(1),则该表达式不适用于
…先生,您在哪里可以确认此信息?if(condition)的意思是if(condition==true)而不是if(condition==true)@Glauco,难道从所有的评论中不应该清楚您误读了某个文档,或者您读的文档不正确吗?正如@MatteoTassinari所说的,我想知道编译器使用的默认行为,它应该是值和类型的比较,如果(条件)@Glauco你搞错了,我不仅会珍惜。它不应该是
==
。你的答案可能是唯一回答我问题的答案。但是我没有在您提供的链接中找到确认默认行为为==和非===的部分,该行为被指定为“如果ToBoolean(GetValue(exprRef))为true…”。这是一个语言规范,不是教程。他们不使用术语“
==
ToBoolean()
是将任何类型转换为布尔值的方法,这意味着正在进行类型转换,这意味着它的行为类似于
=