前端碎碎念 之 [] + {} 和 {} + []一样吗?

『前端碎碎念』系列会纪录我日常平凡看书或许看文章遇到的题目,平常都是比较基本然则轻易忘记的知识点,你也能够会在口试中遇到。 我会查阅一些材料并能够加上本身的明白,来纪录这些题目。更多文章请前去我的个人博客

这道题跟之前提到的[] == ![] 有异曲同工之妙,都是触及到了隐式的强迫范例转换。一样,我们直接直言不讳,总结下加号操作符的运算划定规矩。下面划定规矩推断权重由上往下。

  1. 两个操作数都是数值 时,实行通例的数值加法盘算。但有几个值的斟酌

    • 假如有一个操作数是NaN, 则效果是NaN;

    • Infinity 加 Infinity 效果是 Infinity;

    • -Infinity 加 -Infinity 效果是 -Infinity;

    • Infinity 加 -Infinity 效果是NaN;

    • +0 加 +0 效果是+0;

    • -0 加 -0 效果是 -0;

    • +0 加 -0 效果是+0;

  2. 当有 一个操作数是字符串 时,运用以下划定规矩:

    • 假如两个操作数都是字符串,则将两个字符串拼接起来;

    • 假如只需一个操作符是字符串,则两另一个操作符转换为字符串(toString),然后再将两个字符串拼接起来。

前面两条划定规矩都异常简朴,不会有殽杂。关于其他状况,我总结了下面两条划定规矩:

  1. 有一个操作数是庞杂数据范例(对象,数组) 时,将两个操作数都转换为字符串(ToString)相加。

  2. 有一个操作数是简朴数据范例(true/false, null,undefined) 时,同时不存在庞杂数据范例和字符串,则将两个操作数都转换成数值(ToNumber)相加。

  3. 别的另有一种特别状况{} + 头 的相加式,有些浏览器会将{}视为一个块标记,所以不会介入相加,而是把+标记视为转换符(Number)将背面的操作数转换为数值。

注重上面的划定规矩的权重是从上到下的,每实行一步要从第一条划定规矩最先再举行推断。

下面是改划定规矩的一个推断流程图:

《前端碎碎念 之 [] + {} 和 {} + []一样吗?》

我们来看看这几道题

1.[] + {}

依据划定规矩,[] 和 {} 都是庞杂数据范例,满足有一个操作符是庞杂数据范例, 所以将两个值都转换为字符串,挪用其toString要领,获得:

"" + "[object Object]" = "[object Object]"

2.1+{}

一样满足第三条划定规矩,效果为

"1" + "[object Object]" = "1[object Object]"

3.'1' + false

个中false满足第4条划定规矩,但同时满足第2条划定规矩’1’是字符串,优先处置惩罚第2条划定规矩。所以处置惩罚效果应该是将false转为字符串

"1" + "false" = "1false"

看看题目中的 {} + []

按划定规矩盘算效果应该是
"[object Object]"

然则控制台打印出来的效果倒是0,别忘了第5条,当{}+开首的时刻,{}并不介入盘算,只是被单做一个空的代码块,所以{}+[]实际上是+[], 即Number([]) => Number("") => 0

那末{}+{}就是+{},即是Number({}) => Number("[object Object]") => NaN
但是我们看到效果再次出乎我们的预料,控制台输出的是
"[object Object][object Object]"

究竟是怎么回事?

本来关于{}+{}
差别浏览器会有差别的处置惩罚效果,在chrome中会输出"[object Object][object Object]",在firefox会输出NaN
这应该是差别浏览器的js引擎剖析差别引发的。我们只需记着这个特别状况就好了。

实在这些特别值的盘算我们日常平凡都很少接触到,也没有多大的意义。症结照样要加深对JS中对数值转换的明白,以不变应万变。到真正遇到题目的时刻,不至于摸不着头脑。

    原文作者:fwon
    原文地址: https://segmentfault.com/a/1190000008594899
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞