4

我知道两者之间的区别=====但是我始终认为应该使用严格相等()而不是类型强制相等( )if (condition) condition来评估它。true=====

看一个例子:

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

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

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

它返回:

::1
::2

我知道 1 不严格等于true,因为类型不同,但是当我if (condition)根据 W3C 执行时,它应该===是运行的严格相等测试 ( ) 而不是==.

那么为什么它会记录 1 呢?

4

9 回答 9

9

if语句使用condition == true. 它在 ECMAScript 语言规范中给出,这里: http: //www.ecma-international.org/ecma-262/5.1/#sec-12.5

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

于 2013-07-26T14:23:00.723 回答
5

Javascript aka ECMAScript 不受 W3C 管理,而是由 ECMA 管理。您可以在此处阅读规范。您感兴趣的是节,它指定如何if处理语句中的表达式。运行时应该调用toBoolean表达式值;意味着任何类型都将被转换为布尔值。

因此它的行为类似于==.

于 2013-07-26T14:24:40.317 回答
4

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

if (1 === true) { //they are of a different type

你试过这个

if (0) {  // This fails
    console.log("1");
}

因为0 = off, negative, no, false普遍。检查这个为什么0是假的?

而当你使用===

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

ES5 规范定义了以下算法:

在此处输入图像描述

于 2013-07-26T14:17:54.997 回答
3

当您从一本关于 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 上:

我的猜测是你从所有错误信息的来源那里得到了这个想法。为了您和我的利益,请不要使用 w3schools

如果是 an if (condition), wherecondition应该是正确的,如果表达式由单个值组成expression,它应该是truthy 。如果您要比较 2 个表达式,则条件表达式的计算结果为trueor false,具体取决于您比较两个操作数的方式

单操作数:

if (1)//truthy
if (undefined) //falsy

这是因为 一旦你引入了第二个操作数Boolean(1) === trueBoolean(undefined) === false

if ('0' == 0)//=== true
if ('0' === 0)// === false

那是因为===是类型值检查,你显然已经知道了。就这样没有混淆:

如果你想确保你有正确的信息:检查 ECMAScript 语言规范,而不是一些第三方资源: 这里是链接

于 2013-07-26T14:25:35.713 回答
3

等价于condition == true, 由 ECMAScript 语言规范指定

于 2013-07-26T14:15:54.750 回答
3

3个等号表示“没有类型强制的平等”。使用三等号,值的类型也必须相同。

JavaScript 中 == 和 === 的区别

于 2013-07-26T14:16:56.707 回答
1

Truthy:评估为 TRUE 的东西。Falsey:评估为 FALSE 的东西。

1 为真,0 为假。

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

这些都是虚假的:undefined、null、NaN、0、“”(空字符串)和 false。

因此,在您的第一个条件中if (1)...记录 1 因为 1 是真实的。

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

于 2013-07-26T14:26:57.330 回答
0

注意:有一种将表达式转换为布尔值的简单方法,它使用 !! 操作员。例如
!!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");
}
于 2014-11-02T18:34:44.100 回答
0

我在 ECMA 文档中找到了有关ToBoolean的部分,该部分用于 if 语句。

总结一下:

Number :如果参数为 +0、-0 或 NaN,则结果为 false;否则结果为真。

于 2013-07-26T14:30:40.780 回答