总结:数字、字符串、布尔值、对象之间的转换规则和相等比较

11 篇文章 0 订阅

首先让我们来看一张图:
在这里插入图片描述
在这张图中,连线表示相互比较的类型值,靠近类型值的N或P表示该值在比较时要进行的操作
N:即Number(),把该值做数字转换;
P:toPrimitive(),先检查该值是否有valueOf()方法,如果有并且返回基本值,就使用此值进行强制类型转换,如果没有就使用toString()返回的返回值(如果存在)进行强制类型转换。

还需要了解一些基本信息:
假值列表:null undefined false +0 -0 NaN “” (除此以外的所有字符串都是真值)

  1. tostring:null、true、undefined、数字转换成本身的字符串格式;不能用来转换对象(会得到"[object object]");转换数组时将所有单元 字符串化(a=[1,2,3] 转换成 “1,2,3”)
  2. JSON.stringify()(本质上并不是强制类型转换): 字符串、数字、布尔值、null的转换方式与楼上一样;在对象中遇到undefined、function、symbol会自动忽略,在数组中遇到会在该单元位返回null;如果需要转换的对象中定义了toJSON()方法,会先调用此方法。
  3. toNumber:null、[]、"" 转换成0,undefined转换成NaN;对象和数组会使用P方法。
  4. toBoolean: 规定所有对象都是真值,假值列表以外的都是真值。

以上是将其他值转换为对应类型时的注意点,另外在 + 运算符操作中,若其中一操作数是对象,则先调用P抽象操作,该操作再调用[[DefaultValue]],以数字做上下文,其中数组的valueOf()方法返回数组本身,所以数组调用toString()方法;如果操作数是字符串,则直接拼接。

在相等比较中,我们将对图中几种偏难的情况比较举例子:

  1. 在Boolean类型与其他比较时,Boolean会先转换为Number类型:
    var a=“42”; var b=true;
    a==b的结果应该是什么? 由于这里的true会先被转换为数字1,"42"被转换为数字42,结果为false。

  2. null和undefined :他们彼此相等,且自身相等,其他值包括假值都不和他们相等。

  3. 对象与非对象:

    a=42;b=[42];  a== b 返回什么? [42]调用P操作返回字符串"42",然后变成数字42,故相等。 
    a="abc";b=Object(a);  a==b返回true,P操作会返回b的基本类型值“abc”。
    
  4. 一种极端情况: []== ! [] 返回什么? 这里因为!操作符 会先将 ! [ ] 变成false(假值列表以外都是真值),然后[]==false根据规则返回true。

下面是自己实现看一个对象做比较时是否调用valueOf()和toString()方法:

var obj={
    toString:function(){
        console.log('tostring');
        return Object.prototype.toString.call(this);
    },
    valueOf:function(){
        console.log('valueof');
        return Object.prototype.valueOf.call(this);
    }
}
console.log("obj",obj);  // { toString: ƒ, valueOf: ƒ}
console.log("+obj",+obj);  //  valueof  tostring     NaN
console.log("obj=={}",obj=={});  //false
console.log("obj==={}",obj==={});   //false
console.log("obj=='test",obj=='test');  //  valueof  tostring
console.log("obj==='test",obj==='test');    //false
console.log("obj==0",obj==0,Number(obj));   // false NaN  valueof  tostring    valueof  tostring
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值