为什么"0"== []为假?

The*_*tan 21 javascript

console.log( 0 == '0' );     // true
console.log( 0 == [] );     // true 
console.log( [] == '0' );    // false
Run Code Online (Sandbox Code Playgroud)

为什么JavaScript会像这样评估表达式?

Jam*_*iec 24

简而言之,数字0是假的,字符串"0"不是.

但是,JavaScript会在使用double equals时尝试强制类型.所以你从中得到了真实

console.log( 0 == '0');     // true
Run Code Online (Sandbox Code Playgroud)

因为JavaScript强迫数字.

下一个:

console.log( 0 == [] ); // true
Run Code Online (Sandbox Code Playgroud)

这有点令人困惑,因为空数组是真实的,零是假的.但是,如果你将一个空数组强制转换为一个数字,你得到它的长度 - 这是零.所以这个实际上是0 == 0在对数字进行评估之后进行评估.

有了这个:

 console.log( [] == '0'); // false
Run Code Online (Sandbox Code Playgroud)

JavaScript不能将它们强制转换为相同的类型 - 而另一种则是伪造的,而另一种则不是.

总而言之,这就是为什么使用三等于一般更安全,它检查类型和相等.

下面一个方便的例证

function truthyOrFalsy(val) {
    return val ? "Truthy" : "Falsy";
}

console.log("empty array:", truthyOrFalsy([]));
console.log("number zeroL", truthyOrFalsy(0));
console.log("string with a zero character:", truthyOrFalsy("0"));
Run Code Online (Sandbox Code Playgroud)

  • -1 “双方都是假的……一个是假的,另一个不是” 不,JavaScript 中的所有列表都是真的,即使是空列表。虚假真的与它没有太大关系。 (3认同)
  • 所有这三个例子都有点误解:1)两个操作数都被转换为数字,正如你可以看到`16 =="0x10"`或'NaN!="NaN"`.2)Truthy/falsy与它无关; 实际上`[]`*是*truthy.两者都再次转换为数字,你可以再次看到`16 == ["0x10"]`.3)truthy/falsy再次与它无关.两者都转换为字符串,你可以看到`[1,2] =='1,2'`; 空数组转换为空字符串,不等于包含一个"0"的字符串. (3认同)
  • @TheChetan:我的建议是不要了解它,而是遵循 Douglas Crockford 的建议,始终使用 `===` 来避免处理这种经常出现的古怪行为。 (2认同)

小智 7

/*
If Type(x) is Number and Type(y) is String,
return the result of the comparison x == ToNumber(y).
*/
console.log( 0 == '0');

/*
If Type(x) is either String or Number and Type(y) is Object,
return the result of the comparison x == ToPrimitive(y).
*/
console.log( 0 == [] );

/*
If Type(x) is Object and Type(y) is either String or Number,
return the result of the comparison ToPrimitive(x) == y.
*/
console.log( [] == '0');
Run Code Online (Sandbox Code Playgroud)

来源:http://es5.github.io/#x11.9.3


小智 5

Truthy和Falsy除类型外,每个值还具有一个固有的布尔值,通常称为True或Falsy。有些规则有些奇怪,因此在调试JavaScript应用程序时理解概念和比较效果会很有帮助。

以下值始终是虚假的:

  • 0(零)
  • ”或“”(空字符串)
  • 空值
  • 未定义
  • NaN(例如1/0的结果)

其他一切都是真实的。那包括:

  • '0'(包含单个零的字符串)
  • 'false'(包含文本“ false”的字符串)
  • [](一个空数组)
  • {}(一个空对象)
  • function(){}(“空”函数)

使用==松散相等性比较真实值和虚假值时,可能会发生意外情况:

参见平等宽松比较表

带有==的松散相等比较表