> 科技
javascipt==和===区别(javascipt())
导语:JavaScript 的 == 和 === 怎么理解
相信每个对JavaScript和HTML有一定开发经验的程序员都会对JavaScript这么神奇的语言发出感叹!特别是修改别人的代码内心都是奔溃的,或者在查找程序错误的时候心有都是一万个草泥马跑过。
今天我抽个时间总结总结一下==和===比较容易出错特别是有的时候出错了还找不到问题点吧!
`===` 严格相等,会比较两个值的类型和值
`==` 抽象相等,比较时,会先进行类型转换,然后再比较值
不同类型的值也可以比较,在JAVA,Python等语言里面这样直接报错的了,在开发的时候如果没有留个心眼,出错了都没有办法找,这就是JavaScript神奇的地方了。
===式
如果Type(x)和Type(y)不同,返回false如果Type(x)和Type(y)相同如果Type(x)是Undefined,返回true如果Type(x)是Null,返回true如果Type(x)是String,当且仅当x,y字符序列完全相同(长度相同,每个位置上的字符也相同)时返回true,否则返回false如果Type(x)是Boolean,如果x,y都是true或x,y都是false返回true,否则返回false如果Type(x)是Symbol,如果x,y是相同的Symbol值,返回true,否则返回false如果Type(x)是Number类型如果x是NaN,返回false如果y是NaN,返回false如果x的数字值和y相等,返回true如果x是+0,y是-0,返回true如果x是-0,y是+0,返回true其他返回false==式
如果Type(x)和Type(y)相同,返回x===y的结果如果Type(x)和Type(y)不同如果x是null,y是undefined,返回true如果x是undefined,y是null,返回true如果Type(x)是Number,Type(y)是String,返回 x==ToNumber(y) 的结果如果Type(x)是String,Type(y)是Number,返回 ToNumber(x)==y 的结果如果Type(x)是Boolean,返回 ToNumber(x)==y 的结果如果Type(y)是Boolean,返回 x==ToNumber(y) 的结果如果Type(x)是String或Number或Symbol中的一种并且Type(y)是Object,返回 x==ToPrimitive(y) 的结果如果Type(x)是Object并且Type(y)是String或Number或Symbol中的一种,返回 ToPrimitive(x)==y 的结果其他返回false面两个片段是ecma262规范中对===和==计算过程的定义,翻译过来的。看不明白没有关系下面慢慢解析。
其中涉及到几个es定义的抽象操作:
Type(x) : 获取x的类型ToNumber(x) : 将x转换为Number类型ToBoolean(x) : 将x转换为Boolean类型ToString(x) : 将x转换为String类型SameValueNonNumber(x,y) : 计算非数字类型x,y是否相同ToPrimitive(x) : 将x转换为原始值这里的每个操作都有其严格并复杂的定义,可以直接查阅ECMA规范文档对其的详细说明。
断言:Type(x)不是Number类型断言:Type(x)和Type(y)不同如果Type(x)是Undefined,返回true如果Type(x)是Null,返回true如果Type(x)是String,当且仅当x,y字符序列完全相同(长度相同,每个位置上的字符也相同)时返回true,否则返回false如果Type(x)是Boolean,如果x,y都是true或x,y都是false返回true,否则返回false如果Type(x)是Symbol,如果x,y是相同的Symbol值,返回true,否则返回false如果x和y是同一个对象值,返回ture,否则返回false这个SameValueNonNumber操作说的就是,如果x,y两个值类型相同,但又不同时是Number类型时的比较是否相等的操作。
上面有一部分是从外文翻译的
总结
==和===的异同点:
比较双方都是对象时,只有指向同一个对象才会相等(包含==/===)。
===要求比较双方类型相同并且值相等。
==在比较双方类型不同的时候通常会进行隐式类型转换。
易于记忆的==比较的原则:
null==undefined, null/undefined不进行隐式类型转换。
进行隐式类型或转换时,优先转换成Number型。
记住下面的例子:
onsole.log([10] == 10); //trueconsole.log('10' == 10); //trueconsole.log([] == 0); //true console.log(true == 1); //trueconsole.log([] == false); //trueconsole.log(![] == false); //trueconsole.log('' == 0); //trueconsole.log('' == false); //trueconsole.log(null == false); //falseconsole.log(!null == true); //trueconsole.log(null == undefined); //true
本文内容由小婷整理编辑!