2015-11-06 71 views
4

如果JavaScript中的空数组[]falsy,那么为什么当用作三元运算符中的谓词时,运算符会演变为第一个选项?空阵列是虚假的,但[]? 0:1的计算结果为0

console.log([] == false); // prints true 
console.log([] ? 0 : 1); // prints 0 ! 
+3

你看看'的console.log([] ===假);'? – lucas

+2

尝试'[] === false'并检查。 – ojovirtual

+0

请注意,'[] === false'是错误的,但是[] == false'是真的,我的猜测是归结于javascript如何评估'[]'的类型 – OliverRadini

回答

9

首先,一个空数组不falsey,以获得实际布尔值前缀,它!!如:console.log(!![]) // true

从第一个比较得到的结果是由于胁迫。当执行左与经由==操作数的JavaScript试图将输入强制为通用类型右比较,如下所示:

  1. 右手侧被发现是Boolean因此它被转换成一个Number值,导致比较结果为[] == 0
  2. 由于左侧是一个Object它被转换为一个原语;在这种情况下,String通过[].toString(),导致比较结果为"" == 0
  3. 由于左侧是String,因此将其转换为number值,结果为0 == 0
  4. 由于双方都Number原语,它们的值进行比较,从而产生一个truthy条件

随着第二表达,没有右手来比较,因此它只是测试,如果输入是truthy 。阵列不是nullundefined0,""NaN,因此,这是真的。

要强制两个输入之间进行非强制比较,您应该使用===操作数。

Ecma Standard 6th edition Entry on Coercion
JS Coercion Explained

0

只是要记住。

JavaScript有两种类型的比较操作符:

  1. 严格===:检查类型以及值

  2. 类型转换:仅==检查的值。

尝试这些并检查结果:

console.log([] === false); //prints false console.log([] == false); //prints true console.log(0 == false); //prints true console.log(1 == "1") // prints true console.log(1 === "1") //prints false

我希望它能帮助。

+0

这并不能解释发生背后的原因,它只是显示'=='和'===' – SReject

0

如果空数组[]是在Javascript falsy然后

否,空数组是一个对象,并且因此它是truthy(ref):

if ([]) { 
    alert("[] is truthy") 
} 

那么为什么[] == false e评估为真?行为在the abstract equality comparison algorithm中解释。让我们遵循的规则一步步骤:

对于[] == false的规则规定:

如果Type(y)为布尔型,
返回的比较的结果X == ToNumber(y)的。

所以我们正在评估[] == 0。规则要求:

如果Type(x)是对象和类型(y)为任一字符串或数字,
返回的比较ToPrimitive(X)== y的结果。

将数组转换为原语会在场景后面调用toString方法。所以我们正在评估"" == 0。该规则规定:

如果Type(x)是字符串和类型(y)为号,
回报比较ToNumber结果(X)==年。

Empty string evaluates to zero因此我们最终评估0 == 0,它返回true。

1

将上述答案..

得到任何价值的真正布尔值,你可以用!!前缀它(这样你就不会在任何胁迫问题上运行);

你的情况,你可以这样做:

console.log(!![] == false) //logs false 
相关问题