Javascript与添加空数组和对象的类型和结果混淆

时间:2018-08-17 10:34:58

标签: javascript

我遇到过这种比较:

[] + []   === ''; // true
[] * 1    === 0;  // true
false + 1 === 1;  // true

最后一次比较是有道理的,但是我想知道的是,并且找不到关于[] + []等于空字符串以及为什么[] * 1等于0的资源吗?

1 个答案:

答案 0 :(得分:2)

从hardik-shah发表的评论链接的

The answer当然可以使您更好地了解如何使用javascript处理这些类型的评估。该答案指向ecma文档,这也很有用。我将尝试对您发布的示例的工作方式进行有限的解释。

下面,我引用了我用作解释+运算符的这些实例如何工作的基础的文章。我相信我已经正确地理解了这篇文章,但是我对这些事情不是专家,所以我很乐意得到纠正。


[] + []   === ''; // true

这是正确的,因为两个操作数都是对象。 [].valueOf不返回原语,因此使用[].toString,其结果为''


[] * 1    === 0;  // true

之所以如此,是因为因为其中一个操作数是基元,所以使用算术运算而不是串联运算。 '' * 1的取值为0 * 1,等于0


false + 1 === 1;  // true

这里的两个操作数都是基元,因此将使用算术运算。 Number(false)给我们0,所以0 + 1等于1


来自this article

  
      
  1. 如果至少一个操作数是一个对象,则将其转换为原始值(字符串,数字或布尔值)
  2.   
  3. 转换后,如果至少一个操作数是字符串类型,则将第二个操作数转换为字符串并执行连接
  4.   
  5. 在其他情况下,两个操作数都转换为数字并执行算术加法。
  6.   
     

对象到原始转换:

     
      
  • 如果对象类型为Date,则使用toString()方法;
  •   
  • 在其他情况下   如果返回原始值,则使用valueOf()方法;

  •   
  • 在其他情况下(如果valueOf()不存在或不返回原始值),   然后使用toString()方法。大多数情况下会发生这种情况。

  •