你好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
答案 0 :(得分:7)
这说明了JavaScript中"falsy" values的概念。例如,undefined
与布尔上下文中的false
相同(例如if
条件)。但是,undefined === false
不为真。以下是所有“假的”值:
false
undefined
null
NaN
===
运算符表示“严格相等”(例如,请参阅here);它会抑制自动类型转换。
==
运算符的类型转换规则(来自上面的第二个链接)是:
如果两个操作数不是同一类型,JavaScript会转换操作数,然后应用严格比较。如果任一操作数是数字或布尔值,操作数将尽可能转换为数字;否则,如果任一操作数是一个字符串,则另一个操作数将转换为字符串(如果可能)。如果两个操作数都是对象,那么JavaScript会比较内部引用,当操作数引用内存中的同一个对象时,它们是相等的。
严格的比较规则是:
请特别注意!var
与var == 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
运算符,控制台将记录==
,因为true
与1
的值相同。
可以通过以下方式观察到:
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