首先了解一下基本概念
- 关于JS的数据类型,一共有:number、string、boolean、symbol、undefined、object以上六种
- typeof返回的类型:Object、undefined、String、Number、Function、Boolean
- 类型转换Boolean为false的类型:0、-0、NaN、undefined、“空”、false、null,除此之外,其它都会转化为true
想必一些基本的类型转换大家并不陌生,但接下来要说的是关于引用类型的转换,上代码!!!
1 + [1, 2] = "11,2"
1 + [] = "1"
1 + {a: 123} = "1[object Object]" //注意第一个o小写,第二个大写
[] + {} = "[object Object]"
这些结果可能跟我们想得有点不太一样,关于数组与对象,他们之间的转换有着一定的小秘密。
1.每个数组和对象都会继承toString和valueOf这两个方法
2. 在有类型转换的时候,会先执行toString(),后执行valueOf()
举个栗子:(对象的)
var obj = {
valueOf(){
return 'hello'
},
toString(){
return 'world'
}
}
console.log(1 + obj) // "1hello"
var obj = {
toString(){
return 'world'
}
}
console.log(1 + obj) // "1world"
这两者稍作对比,toString与valueOf的先后顺序一目了然呀
再举一个栗子:(数组的)
Array.prototype.valueOf = function(){
return 'abc'
}
Array.prototype.toString = function(){
return 'cba'
}
console.log(1 + arr) // "1abc"
Array.prototype.toString = function(){
return 'cba'
}
console.log(1 + arr) // "1cba"
同理,数组在类型转换时执行的先后顺序与对象一样,先toString后valueOf
- toString和valueOf都是可以被覆盖的,当对象的toString没有被覆盖时,会自动返回[object 对象类型]
- 其中,Array、Object、Date就是它的对象类型
基于此,下面的输出语句就很好解释了
1 + [1, 2] = "11,2"
解析:
1. [1, 2].toString() --> "1, 2"
2. "1, 2".valueOf() --> "1, 2"
3. 1 + "1, 2" --> "11,2"