0

你好,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" ) };

我期待发现第二个块只是第一个块的倒数(换句话说,值只会切换),但是,看起来只有设置为非字符串“true”的变量实际上返回 true。为什么是这样?两种评价的根本区别是什么:

!q1Var1

vs.

true === q1Var1
4

4 回答 4

7

这说明了JavaScript中“虚假”值的概念。例如,undefined变得与false布尔上下文(如if条件)中的相同。然而,undefined === false事实并非如此。以下都是“假”值:

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

运算符的===意思是“严格相等”(例如,参见此处);它禁止自动类型转换。

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

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

严格的比较规则是:

  • 当两个字符串具有相同的字符序列、相同的长度和对应位置的相同字符时,它们是严格相等的
  • 当两个数字在数值上相等(具有相同的数值)时,它们是严格相等的。NaN 不等于任何东西,包括 NaN。正零和负零彼此相等
  • 如果两个布尔操作数都为真或都为假,则两个布尔操作数严格相等
  • 无论是严格比较还是抽象比较,两个对象都不相等
  • 仅当操作数引用相同的对象时,比较对象的表达式才为真
  • Null 和 Undefined 类型是 ==(但不是 ===)

请特别注意,这!varvar == false(当然也与var === falseifvar不是开头的布尔值不同)不同。非空字符串是“真实的”(!"..."始终false适用于任何非"..."空字符串),但是当转换为数字(如"0")时评估为 0 的非空字符串是== false.

于 2012-10-29T17:59:19.417 回答
0

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

而第一组,我对此有点模糊,我认为正在测试一个对象,因为测试没有上下文......至少,我认为这就是正在发生的事情......oo

于 2012-10-29T18:09:52.727 回答
0

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

if( q1Var1 === true ) 

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

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

然后控制台将记录false,因为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

在另一端,

if( !q1Var1 ); 

测试 q1Var1 是否为 0。值得注意的是,因为false在值上也等于 0(但仍然不是类型),

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)

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

if (!0) { console.log(true); } else { console.log(false); }//true
if (!false) { console.log(true); } else { console.log(false); }//true
于 2012-10-29T18:05:10.320 回答
0

当我们有一个操作的 2 个不同操作数时,应该对第一个值进行解释(类型转换)以返回第二个操作数类型的结果,这称为type cast. 在条件方程中,结果应该是boolean类型,所以结果总是被转换为boolean,所以回到你的问题,所有这些例子都是cast不同的类型boolean。在 javascript 中,转换是自动进行的,但在某些语言中,尤其是在使用strict语法时,您应该自己指定转换,否则您的日志将充满错误。

于 2012-10-29T18:08:15.003 回答