JavaScript,对比理解==和===的区别,!=和!==有何区别?
发布于 作者:苏南大叔 来源:程序如此灵动~
在写JavaScript/Nodejs/TypeScript代码的时候,经常会遇到判断两个变量是否相等的情况。一般的时候会使用==或者!=来进行判断,有的时候也会碰到===或者!==进行判断的时候,那么,两个等号和三个等号两者到底有什么不同呢?这就是本文要探讨的问题。

苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码感想感悟。测试环境:win10,chrome@116.0.5845.141,node@16.14.2。结论:大多数情况下,使用==和===是没有太大区别的。但是,如果考虑代码逻辑严格的话,还是推荐使用===和!==。
本文其实没有对两个不等号进行推理判断,大家自行推论吧。
基础类型判断
主要是string、int、float等基础类型的变量相等判断。参考代码:
var a = "0"
var b = 0
var c = parseFloat(0.000.toFixed(2));
console.log(a,typeof(a));
console.log(b,typeof(b));
console.log(c,typeof(c));
console.log( `a == b`, a == b );
console.log( `a == c`, a == c );
console.log( `b == c`, b == c );
console.log( `a === b`, a === b );
console.log( `a === c`, a === c );
console.log( `b === c`, b === c );输出:
0 string
0 number
0 number
a == b true
a == c true
b == c true
a === b false
a === c false
b === c true从结果上来说,对于基础类型来说,
==判断更加宽泛,值一样就可以判断为相等。===判断更加严格,类型不同,就会被判断为不相等。
而对于整形b和浮点型c来说,类型判断都为number。所以,两者的三等号判断,是true。
object、array判断
测试代码:
class A {
constructor(uname) {
this.uname = uname;
}
}
var a = new A("sunan");
var b = new A("sunan");
console.log( `a == b`, a == b );
console.log( `a === b`, a === b );
var c = {"cc":"ccc"};
var c2 = {"cc":"ccc"};
console.log( `c == c2`, c == c2 );
console.log( `c === c2`, c === c2);
var d = ["d"];
var d2 = ["d"];
console.log( `d == d2`, d == d2 );
console.log( `d === d2`, d === d2);输出:
a == b false
a === b false
c == c2 false
c === c2 false
d == d2 false
d === d2 false
这些高级array、object或者自定义的类型,变量里面保存的是引用的内存地址,所以正常情况下,无论双等号还是三等号,两者都是不相等的。然而!下面的写法是特例:
class A {
constructor(uname) {
this.uname = uname;
}
}
var a = b = new A("sunan");
console.log( `a == b`, a == b );
console.log( `a === b`, a === b );
var c = c2 = {"cc":"ccc"};
console.log( `c == c2`, c == c2 );
console.log( `c === c2`, c === c2);
var d = d2 = ["d"];
console.log( `d == d2`, d == d2 );
console.log( `d === d2`, d === d2);输出值是:
a == b true
a === b true
c == c2 true
c === c2 true
d == d2 true
d === d2 true
相关文章
- https://newsn.net/say/js-question-question.html
- https://newsn.net/say/js-hook.html
- https://newsn.net/say/js-object-set-get.html
- https://newsn.net/say/js-object-writable.html
结束语
如果除去Nan/undefined/null/false这些特殊的空值外,目前的结论是:基础类型判断的时候,双等号(或者!=)比较的是值,三等号(或者!==)比较的是值和类型(整形和浮点数算同一个类型number)。稍稍高级点的类型比较的时候,比较的是引用。所以,只要引用相同,那么双(三)等号判断就相同。