js隐式转换问题

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值