JavaScript-评估真/假值的方法的差异

时间:2012-10-29 17:58:26

标签: javascript evaluation

你好JS的瘾君子。有人可以向我解释以下评估变量真实性的方法之间的区别吗?

var q1Var1 = "hello",
        q1Var2 = 0,
        q1Var3 = true,
        q1Var4 = "false",
        q1Var5 = -1,
        q1Var6 = undefined,
        q1Var7 = null,
        q1Var8;

// What is the difference between this block of code:

console.log( !q1Var1 );
console.log( !q1Var2 );
console.log( !q1Var3 );
console.log( !q1Var4 );
console.log( !q1Var5 );
console.log( !q1Var6 );
console.log( !q1Var7 );
console.log( !q1Var8 );

// and this block?

if( q1Var1 === true ){ console.log( "true" ) } else { console.log( "false" ) };
if( q1Var2 === true ){ console.log( "true" ) } else { console.log( "false" ) };
if( q1Var3 === true ){ console.log( "true" ) } else { console.log( "false" ) };
if( q1Var4 === true ){ console.log( "true" ) } else { console.log( "false" ) };
if( q1Var5 === true ){ console.log( "true" ) } else { console.log( "false" ) };
if( q1Var6 === true ){ console.log( "true" ) } else { console.log( "false" ) };
if( q1Var7 === true ){ console.log( "true" ) } else { console.log( "false" ) };
if( q1Var8 === true ){ console.log( "true" ) } else { console.log( "false" ) };

我期望发现第二个块只是第一个块的反转(换句话说,值只会切换),但是,看起来只有设置为nonstring“true”的变量实际上返回true。为什么是这样?两次评估之间的根本区别是什么:

!q1Var1

vs.

true === q1Var1

4 个答案:

答案 0 :(得分:7)

这说明了JavaScript中"falsy" values的概念。例如,undefined与布尔上下文中的false相同(例如if条件)。但是,undefined === false 为真。以下是所有“假的”值:

  • false
  • undefined
  • 空字符串
  • 数字0
  • null
  • NaN

===运算符表示“严格相等”(例如,请参阅here);它会抑制自动类型转换。

==运算符的类型转换规则(来自上面的第二个链接)是:

  

如果两个操作数不是同一类型,JavaScript会转换操作数,然后应用严格比较。如果任一操作数是数字或布尔值,操作数将尽可能转换为数字;否则,如果任一操作数是一个字符串,则另一个操作数将转换为字符串(如果可能)。如果两个操作数都是对象,那么JavaScript会比较内部引用,当操作数引用内存中的同一个对象时,它们是相等的。

严格的比较规则是:

  • 两个字符串在相应位置具有相同的字符序列,相同的长度和相同的字符时严格相等
  • 两个数字在数值上相等(具有相同的数值)时严格相等。 NaN不等于任何东西,包括NaN。正负零彼此相等
  • 两个布尔操作数严格相等,如果两者都为真或两者都为假
  • 对于严格或抽象的比较,两个对象永远不会相等
  • 仅当操作数引用相同的对象
  • 时,才会将比较对象的表达式设为true
  • 空和未定义的类型是==(但不是===)

请特别注意!varvar == false不同(如果var === false不是一个布尔值,则var当然不一样)。非空字符串是“真实的”(!"..."对于任何非空false始终为"...",但非空字符串在转换为数字时评估为0(如{{ 1}})是"0"

答案 1 :(得分:0)

===运算符可能有点混乱,有时会被滥用。使用===运算符时,请务必记住它比较类型和值。因此,当使用这样的语句时:

if( q1Var1 === true ) 

它要求q1Var1具有true的相同类型和值。如果情况设置如下:

q1Var1 = 1; 
if (q1Var1 === true) { console.log(true); } else { console.log(false); }//false

然后控制台将记录false,因为1与[{1}}的类型和值不同。

但是,使用true运算符,控制台将记录==,因为true1的值相同。

可以通过以下方式观察到:

true

另一方面,

if (1 == true) { console.log(true); } else { console.log(false); }//true
if (1 && true) { console.log(true); } else { console.log(false); }//true

测试q1Var1是否为0.值得注意的是,因为if( !q1Var1 ); 在值上也等于0(但仍不在类型中),

false

这个测试对于数字和布尔值都可以是真的,因为没有类型的测试。

if (0 && false) { console.log(true); } else { console.log(false); }//true (same value)
if (0 == false) { console.log(true); } else { console.log(false); }//true (same value)
if (0 === false) { console.log(true); } else { console.log(false); }//false (same value, different type)

答案 2 :(得分:0)

当我们有一个操作的2个不同的操作数时,将使第一个值的解释(类型转换)成为第二个操作数的类型返回结果,并将其称为type cast。在条件方程式中,结果显示为boolean类型,因此结果始终会转换为boolean,因此,回到您的问题,所有这些示例都是cast不同类型的boolean strict 。在javascript中自动进行转换,但在某些语言中,尤其是在使用{{1}}语法时,您可以自己指定转换,否则您的日志将会出错。

答案 3 :(得分:0)

据我了解,第二组测试(q1Var1 === true)正在寻找绝对平等。它并不默认为真实性,因为它正在寻找一个完美的匹配。

然而第一组,我对这一点有点模糊,我认为是测试一个对象因为测试没有上下文...至少,我认为那是发生了什么...... oo