极客时间返利平台,你可以在上边通过山月的链接购买课程,并添加我的微信 (shanyue94) 领取返现。
山月训练营之面试直通车 服务上线了,从准备简历、八股文准备、项目经历准备、面试、面经、面经解答、主观问题答复、谈薪再到入职的一条龙服务。

# 关于类型转化,判断以下代码输出

更多描述

Boolean(new Boolean(false));
Boolean(document.all);

[] == "";
[3] == 3;
[] == false;
42 == true;

Issue

欢迎在 Gtihub Issue 中回答此问题: Issue 586 (opens new window)

Author

回答者: mrrs878 (opens new window)

==时,会强制类型转换并比较转换后的结果

比较过程如下:

  • 如果两个变量都是对象,则当都引用同一对象时才返回true
  • null == undefined ? 返回true
  • 当两个变量类型不一致时会进行类型转换:
    • string == number ? string转换为number后再进行比较
    • boolean == any ? boolean转换为number后再进行比较
    • object == string/number/symbol ? 尝试调用objectvalueOftoString将其转换为原始类型后再进行比较
  • 当两个变量类型一致时:
    • number == number ? 其中有一个为NaN时返回false; +0 == -0时返回true

非原创,原作者未知

所以[] == 0时:

  1. []先调用Array.prototype.toString转为原始值
Array.prototype.toString.call([]);
// ""
  1. "" == 0""转为number即 0

  2. 0 == 0,返回true

其他几行代码同理

Author

回答者: wuzqZZZ (opens new window)

[] == "";
// 1. [].toString() => ""
// 2. "" == ""
// 3. Number("") => 0
// 4. 0 == 0 => true

[3] == 3;
// 1. [3].toString() => "3"
// 2. "3" == 3
// 3. Number("3") => 3
// 4. 3 == 3 => true

[] == false;
// 1. [].toString() => ""
// 2. "" == false
// 3. Number("") => 0   Number(false) => 0
// 4. 0 == 0 => true

42 == true;
// 1. Number(true) => 1
// 2. 42 == 1 => false
Last Updated: 9/27/2022, 2:39:59 PM