"+"运算符以及String和Number
输入:>>>
输出:<<<
"+"运算符转换规则
如果不全是数字则优先转化为字符串 因该是如果有一个字符串或者对象就转换字符串
>>> 1+“1”
<<< “11”
相当于String(1)+“1”
>>> “1”+1
<<< “11”
只操作一个数据时相当于Number()
>>> +“1”
<<< 1
相当于Number(“1”)
连接字符串
>>> “123”+“45”
<<< “12345”
总结:仅操作一个数据就是Number,有多个数据时但是不全是数字则其实是两个数据String()后相加
String机制
>>> String([])
<<< “”
首先看对象有没有toString这个函数
如果有的话是否返回一个原始值(数字,字符串,布尔值,null,undefined,NaN)
如果没有返回原始值则抛出类型异常错误。
如果没有toString则会检查有没有valueOf然后同上
做个试验验证一下
var test = {
a:1,
toString:function(){ return 123 },
}
String(test)
//这里会输出 “123”
相当于 String(test.toString())
这里再做一个返回非原始值的实验
var test = {
a:1,
toString:function(){ return /asdf/ },//我们返回一个正则
}
String(test)
这里报错了
TypeError: Cannot convert object to primitive value
Number机制
>>> Number([])
<<< 0
类似于String
但是先去找valueOf再去找toString
错误都是TypeError
javascript权威指南第6版
53页3.8.3 对象到数字中说会抛出类型异常错误
String()是会抛出 如果使用Number的话如果不能转换会转成 NaN
混合作用
>>> 1 + []//这个像0的是空数组 [ ]
猜是啥
首先不是全是数字所以优先字符串也就是说 一个数字一个对象所以优先字符串
相当于
>>> 1 + String([])
相当于
>>> 1 + String([].toString())
相当于
>>> 1 + ‘’
<<< '1’
特例
>>> 1 + true
<<< 2
>>> 1 + null; 1 + false
<<< 1
但要注意Number(undefined) 和 Number(NaN)是NaN
因此
>>> 1 + undefined
<<< NaN
几个固定值
只要是原始量Number和String能都进行转换
Number(null) = 0
Number(undefined) = NaN
Number(true) = 1
Number(false) = 0
String(null) = ‘null’
String(undefined) = 'undefined’