1.valueOf()与 toString()方法
valueOf()方法返回一个数据的原始值
toString()调用的是原型上的toString(假设对象上没有重写这个方法)
let obj = {
toString(){
return 1
},
valueOf(){
return 2
}
}
console.log(Number(obj)) //2
由此可见Number(obj)的时候,返回的是valueOf的返回值
当使用Number(obj)的时候
再来看个例子
let obj = {
toString(){
return 1
},
valueOf(){
return {}
}
}
console.log(Number(obj)) //1
上面的例子中返回的是 1 也就是toString上的方法返回值
当valueOf的返回值不是一个基本数据类型的时候,就回去调用toString()上的方法,所以返回1
当使用String()的时候
let obj = {
toString(){
return 1
},
valueOf(){
return 2
}
}
console.log(String(obj)) //1
这里返回的直接是1,要字符串化一个值,首先调用toString()
上的方法,这里当toString()方法返回的结果不是1,而是一个引用的对象类型的话,就会去调用valueOf上的方法的返回值了
let obj = {
toString(){
return []
},
valueOf(){
return 2
}
}
console.log(String(obj)) //2
2.隐式转换
在隐式转换的过程中,需要有几个特殊的加以记忆
undefined == undefined //true
undefined == null //true
null == undefined //true
null == null //true
NaN == NaN //false
undefined 只等于 它自己和null
null 只等于 它自己和 undefined
NaN 和谁都不等 ,它连它自己都不相等 再别说别的值
在这个基础上再来看其他的转换问题
'1' == 1
true == 1
true == '1'
首先,这三个结果都为true
转换的过程就是,用Number()来判断每一个,再比较
Number(1) //1
Number('1') //1
Number(true) //1
// 所以这三个都是true
//提问:使用该规则来判断:
undefined == null
Number(undefined) // NaN
Number(null) //0
//上边说了 NaN和谁都不相等 ,所以理论上应该为 false
//但是 别忘了 undefined == null 答案为true 这个
//例子本来就是一个特例
再来看引用类型的比较
console.log([1] == 1) //true
console.log([] == false) // true
console.log(['1'] == true) //true
console.log({} == 1) //false
按照上文的规则: 以第一个举例子
Number([1]) => (当在Number()一个值得时候,会首先调用它的valueOf()方法,因为[1]是一个引用类的值,所以调用toString()方法,结果为1) Number(1) 就是1 1==1 所以这里是true
3.布尔类型的转换
这个就比较简单
除过 0 false ‘’ null undefined NaN 这六种其他都为true
[] == ![] //true
{} == !{} //false
{} == {} //false
[] == [] //false
用以上规则,就可以轻松的值
1.Number([ ]),调用toString()方法,返回’’(空字符串),Number(’’) 结果为0,Number(![]) ![]是false 因为 Boolean([])为true,不在上述的六种里面, !true = false , 再使用Number(false) 其结果为0 0==0结果为true
Number(undefined) //NaN
Number(null) // 0
Number(' ') //0