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

gog*_*net 0 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" ) };
Run Code Online (Sandbox Code Playgroud)

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

!q1Var1

vs.

true === q1Var1
Run Code Online (Sandbox Code Playgroud)

Ted*_*opp 7

这说明了JavaScript 中"虚假"值的概念.例如,undefined变得与false布尔上下文(例如if条件)中的相同.但是,undefined === false不是真的.以下是所有"假的"值:

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

===运营商表示"严格相等"(见这里,例如); 它抑制了自动类型转换.

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

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

严格的比较规则是:

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

特别要注意的是,!var它不一样var == false(并且当然不一样,var === false因为var它不是一个开头的布尔值).非空字符串是"truthy"(!"..."总是false用于任何非空的"..."),但非空字符串在转换为数字(例如"0")时计算为0 == false.

  • 需要更多的实质,或许解释`===`非铸造比较. (3认同)