JS相等比较运算符的匹配规则及if()条件的判断怎么写


这篇“JS相等比较运算符的匹配规则及if()条件的判断怎么写”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“JS相等比较运算符的匹配规则及if()条件的判断怎么写”文章吧。我们都知道,在JS中,要尽量使用全等运算符(“===”),因为全等运算符在比较时都不会进行类型的转化,相对而言速度也会更快。那么什么时候使用相等运算符(“==”)呢?以下两种情况供参考:用于判断对象的属性是否存在

letobj={};
if(obj.a==null){
//这里相对于:obj.a===null||obj.a===undefined的简写形式,jquery源码的推荐写法
}

用于判断函数的参数是否存在

functionfn(a,b){
if(a==null){
//这里也相当于a===null||a===undefined的简写
}
}

总结: 一般情况下我们尽量使用“===”来精确判断,在判断对象属性和函数参数是否存在时可以使用“==”。接下来让我们总结一下各种数据类型使用这两种运算符所得到的结果,其中:绿色表示结果为true,白色表示结果为false2.1 全等运算符(“===”)的操作结果2.2 相等运算符(“==”)操作结果2.3 if()条件判断结果(转载自:js中比较运算符隐式类型转换)3.1 全等运算符 (“===”)说明: 严格匹配,不会类型转换,必须要数据类型和值完全一致。

先判断类型,如果类型不是同一类型的话直接为false;

1对于基本数据类型(值类型):Number,String,Boolean,Null和Undefined:两边的值要一致,才相等
console.log(null===null)//true
console.log(undefined===undefined)//true
注意:NaN:不会等于任何数,包括它自己
console.log(NaN===NaN)//false

2对于复杂数据类型(引用类型):Object,Array,Function等:两边的引用地址如果一致的话,是相等的
arr1=[1,2,3];
arr2=arr1;
console.log(arr1===arr2)//true

3.2 相等运算符 (“==”)非严格匹配: 会类型转换,但是有前提条件一共有五种情况
(接下来的代码以 x == y 为示例)x和y都是null或undefined:
规则: 没有隐式类型转换,无条件返回true

console.log(null==undefined);//true
console.log(null==null);//true
console.log(undefined==undefined);//true

x或y免费云主机域名是NaN : NaN与任何数字都不等
规则:没有隐式类型转换,无条件返回false

console.log(NaN==NaN);//false

x和y都是string,boolean,number
规则:有隐式类型转换,会将不是number类型的数据转成number

console.log(1==true);//true(1)1==Number(true)
console.log(1=="true");//false(1)1==Number('true')
console.log(1==!"true");//false(1)1==!Boolean('true')(2)1==!true(3)1==false(4)1==Number(false)
console.log(0==!"true");//true
console.log(true=='true')//false

x或y是复杂数据类型 : 会先获取复杂数据类型的原始值之后再左比较
复杂数据类型的原始值: 先调用valueOf方法,然后调用toString方法
valueOf:一般默认返回自身
数组的toString:默认会调用join方法拼接每个元素并且返回拼接后的字符串

console.log([].toString());//空字符串
console.log({}.toString());//[objectObject]
注意:空数组的toString()方法会得到空字符串,
而空对象的toString()方法会得到字符串[objectObject](注意第一个小写o,第二个大写O哟)

console.log([1,2,3].valueOf().toString());//‘1,2,3’
console.log([1,2,3]=="1,2,3");//true(1)[1,2,3].toString()=='1,2,3'(2)'1,2,3'=='1,2,3'
console.log({}=='[objectObject]');//true

x和y都是复杂数据类型 :
规则只比较地址,如果地址一致则返回true,否则返回false

vararr1=[10,20,30];
vararr2=[10,20,30];
vararr3=arr1;//将arr1的地址拷贝给arr3

console.log(arr1==arr2);//虽然arr1与arr2中的数据是一样,但是它们两个不同的地址
console.log(arr3==arr1);//true两者地址是一样

console.log([]==[]);//false
console.log({}=={});//false

3.3 经典面试题

注意:八种情况转boolean得到false:0-0NaNundefinednull''falsedocument.all()

console.log([]==0);//true
//分析:(1)[].valueOf().toString()==0(2)Number('')==0(3)false==0(4)0==0
console.log(![]==0);//true
//分析:逻辑非优先级高于关系运算符![]=false(空数组转布尔值得到true)

console.log([]==[]);//false
//[]与右边逻辑非表达式结果比较
//(1)[]==!Boolean([])(2)[]==!true(3)[]==false(4)[].toString()==false(5)''==false(6)Number('0')==Number(false)
console.log([]==![]);//true

onsole.log({}=={});//false
//{}与右边逻辑非表达式结果比较
//(1){}==!{}(2){}==!true(3){}==false(4){}.toString()==false(5)'[objectObject]'==false(6)Number('[objectObject]')==false
console.log({}==!{});//false

3.4 变态面试题

vara=???
if(a==1&&a==2&&a==3){
console.log(1)
}

//如何完善a,使其正确打印1

//答案
vara={
i:0,//声明一个属性i
valueOf:function(){
return++a.i;//每调用一次,让对象a的i属性自增一次并且返回
}
}
if(a==1&&a==2&&a==3){//每一次运算时都会调用一次a的valueOf()方法
console.log("1");
}

以上就是关于“JS相等比较运算符的匹配规则及if()条件的判断怎么写”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注百云主机行业资讯频道。

相关推荐: .Net Core日志记录器如何实现

这篇文章主要介绍“.NetCore日志记录器如何实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“.NetCore日志记录器如何实现”文章能帮助大家解决问题。ILoggerFactory是日志记录器的工厂接口类,用于配…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 02/17 12:21
下一篇 02/17 12:21

相关推荐