JavaScript类型转换

Evg*_*nyt 5 javascript types casting

考虑空的JavaScript数组:

var a = [];
alert(a == false); // shows true
alert(!a); // shows false!
Run Code Online (Sandbox Code Playgroud)

怎么解释这个?规则是什么?

Rya*_* Li 12

来自http://forums.whirlpool.net.au/archive/966449:

a == false:

在这种情况下,左侧的类型是对象,右侧的类型是布尔值.Javascript首先将布尔值转换为数字,然后生成0.然后它将对象转换为"基元",产生空字符串.接下来,它将空字符串与之比较0.空字符串被转换为数字,屈服0,在数字上等于0右边的数字,因此整个表达式的结果是true.

有关所有血腥细节,请参阅ECMAScript规范的 §11.9.3 .

(!a):

在这种情况下,Javascript将对象转换为布尔值true,然后将其反转,结果为false.


SLa*_*aks 8

!运营商检查是否它的操作数是"falsy".

以下是真实的:

  • !false
  • !0
  • !null
  • !NaN
  • !undefined
  • !""

==运营商检查松动的平等,它有无关falsiness.

具体来说,a == b将操作数转换为数字,然后比较数字.
包含数字的字符串会转换为它们包含的数字; 布尔值转换为01.如果已定义,则
通过调用来转换对象valueOf.

因此,以下所有都是如此:

  • "1" == 1
  • "0" == false
  • "1" == true
  • "2" != true
  • "2" != false
  • ({ valueOf:function() { return 2; } }) == 2
  • ({ valueOf:function() { return 1; } }) == true

  • @qwerty:"2!= 3"和"2!= 4"的方式都是正确的 (3认同)
  • 怎么("2"!=真),("2"!=假)都是真的吗? (2认同)

CMS*_*CMS 5

==当操作数之一为布尔值时的运算符,将另一个操作数类型转换为数字。

[] == 0;
Run Code Online (Sandbox Code Playgroud)

相当于:

0 == 0;
Run Code Online (Sandbox Code Playgroud)

您可以在规范上查看抽象平等比较算法的完整详细信息。

如您所见,一个空数组对象在转换为 Number 时会产生0

+[]; // 0
Number(0);
Run Code Online (Sandbox Code Playgroud)

这真的是因为它的 toString 方法产生了一个空字符串,例如:

[].toString(); // ""

+""; // 0
Number(""); // 0
Run Code Online (Sandbox Code Playgroud)