6 个回答

可以看一下这个:
http://www.cnblogs.com/ziyunf...

简单的来说:

[] + []会先调用[]valueOf方法,如果valueOf返回的是基本类型,则使用这个基本类型值,如果返回的不是基本类型,则舍弃valueOf方法,转而调用toString方法。

[].valueOf() => [] // 非基本类型
[].toString() => "" // 基本类型

所以[] + [] = "" + "" = ""

可以写一个简单的例子来验证它:

const a = [] // 定义一个空数组
a.valueOf = () => 3 // 改写它的valueOf方法
a + a // 6
a.valueOf = () => ([1, 2, 3])
a + a // ""
a.toString = () => 'haha'
a + a // 'hahahaha'
a.toString = () => ([1, 2, 3])
a + a // 报错啦
[].toString()+[].toString() === ""

这是js的运算符对数据的隐式转换造成的。

js中+号运算符会对引用类型的数据调用toString方法转为字符串

二元运算符'+'可以对两个数字做加法也可以做字符串连接
加号的转换规则优先考虑字符串连接
————以上摘自犀牛书第六版P70
这是加号运算符的规则所致
除非前后两个操作数都不是类字符串才会转化

如果规则是优先考虑数字的算数运算 那么[]+[]就是0了
在这里对操作数两边都进行了转化为字符串的隐式转换
类似的还有:[] == ! []
!对[]进行了变为布尔值的转换

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题