小白首发,谈谈 '==' 背后的故事

        '==' 和 '===' 都是最常见的逻辑运算符。使用它们应该是十分初级的事情,但是我们只知道如何使用,却经常会忽略掉这些运算符别后到底做了什么。

今天在敲代码的时候遇到一个例子:

var str = '0';//非空字符0
if( str ){
    alert('true');
}
else{
    alert('false');
}//true
if( str == true ){
    alert('true');
}
else{
    alert('false');
}//false

        在if结构里面,非空字符串等价于true,因此第一个alert会弹出'true'的信息,于是我就很容易地认为,'0'和true相等,使用‘==’运算符应该会得到true,但是结果正好相反,alert出来的是‘false’;

        为什么会这样呢,js的逻辑运算符在运行之前,会对操作数进行类型的检测,js会想办法尽可能把这些操作数转换成自己需要的类型; 例如if()结构,需要的是一个boolean类型的值,那么一个非空的字符当然会被转换成true; 而 ‘==’ 是一个不严格的运算符,他的两个操作数可能是不同类型的值,所以在比较之前,它会按照下面的规则将他们全部转换成可以比较的值:

        1、null和undifined相等

        2、当数字和字符串比较时,会先努力将字符串转换为整形(因此整形字符串和整形是相等的, ‘3’ == 3, ‘0’ == 0 都为true)

        3、true --> 1, false --> 0

        4、如果是对象,会先尝试使用toString()方法或者valueOf()方法将对象转换成字符串或原始值,再比较,若比较都失败,则返回false(日期类的只尝试用toString()方法)

        js只能做到这里,除了以上这几种情况,不同类型之间的操作数用‘==’进行运算,都会返回false;因此,例子中的情况,str == true,true会先转换为1,这样就是字符串和整形比较,因此str = ‘0’会转换成0,0==1返回false妥妥的……

        这里有两种情况需要提醒,

        1、NaN与任何值参与‘==’运算都会返回false,很好理解,NaN代表变量值不是一个数字,这意味着这个变量是一个集合当中的任意以一种可能性,这种变量无法进行比较。

        2、两个对象之间参与‘==’运算,除非这两个对象都是对同一个对象的引用或一个是对另一个的引用,否则都返回false;(比较的是内存地址,而不是内容)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值