我遇到过这种比较:
[] + [] === ''; // true
[] * 1 === 0; // true
false + 1 === 1; // true
最后一次比较是有道理的,但是我想知道的是,并且找不到关于[] + []
等于空字符串以及为什么[] * 1
等于0
的资源吗?
答案 0 :(得分:2)
The answer当然可以使您更好地了解如何使用javascript处理这些类型的评估。该答案指向ecma文档,这也很有用。我将尝试对您发布的示例的工作方式进行有限的解释。
下面,我引用了我用作解释+
运算符的这些实例如何工作的基础的文章。我相信我已经正确地理解了这篇文章,但是我对这些事情不是专家,所以我很乐意得到纠正。
[] + [] === ''; // true
这是正确的,因为两个操作数都是对象。 [].valueOf
不返回原语,因此使用[].toString
,其结果为''
[] * 1 === 0; // true
之所以如此,是因为因为其中一个操作数是基元,所以使用算术运算而不是串联运算。 '' * 1
的取值为0 * 1
,等于0
false + 1 === 1; // true
这里的两个操作数都是基元,因此将使用算术运算。 Number(false)
给我们0,所以0 + 1
等于1
- 如果至少一个操作数是一个对象,则将其转换为原始值(字符串,数字或布尔值)
- 转换后,如果至少一个操作数是字符串类型,则将第二个操作数转换为字符串并执行连接
- 在其他情况下,两个操作数都转换为数字并执行算术加法。
对象到原始转换:
- 如果对象类型为Date,则使用toString()方法;
在其他情况下 如果返回原始值,则使用valueOf()方法;
在其他情况下(如果valueOf()不存在或不返回原始值), 然后使用toString()方法。大多数情况下会发生这种情况。