JS 应用篇(二):== 与 === 的区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/madman0621/article/details/82932729

目录:

一、== 与 === 的概念

1、 "==“叫做相等运算符,”==="叫做严格运算符。
2、 ==,等同的意思,两边值类型不同的时候,要先进行类型转换为同一类型后,再比较值是否相等。
===,恒等的意思,不做类型转换,类型不同的结果一定不等。
3、 "==“表示只要值相等即可为真,而”==="则要求不仅值相等,而且也要求类型相同。

对于明确数据类型的用===更为可靠,JavaScript是一门弱类型语言,表达式运算赋值等操作都会导致类型转换。而一些隐式转换会带来一些意想不到的后果。

建议:尽量使用严格运算符 ===。因为"=="不严谨,可能会带来一些违反直觉的后果。

二、严格运算符===的运算规则

1、不同类型值:如果两个值的类型不同,直接返回false。

2、同一类的原始类型值:同一类型的原始类型的值(数值number、字符串string、布尔值boolean)比较时,值相同就返回true,值不同就返回false。

3、同一类的复合类型值/高级类型:两个复合类型(对象Object、数组Array、函数Funtion)的数据比较时,不是比较它们的值是否相等,而是比较它们是否指向同一个对象。即“地址指针”是否相等。

详细说明:
1、如果类型不同,就[不相等]
2、如果两个都是数值,并且是同一个值,那么[相等];
3、如果两个都是字符串,每个位置的字符都一样,那么[相等];否则[不相等]。
4、如果两个值都是true,或者都是false,那么[相等]。
5、如果两个值都引用同一个对象或函数,那么[相等];否则[不相等]。
6、如果两个值都是null,或者都是undefined,那么[相等]。

三、相等运算符==的运算规则

相等运算符"==“在比较相同类型的数据时,与严格运算符”===“完全一样。
在比较不同类型的数据时,相等运算符”==“会先将数据进行类型转换,然后再用严格相等运算符”==="比较。

类型转换规则如下:
1、原始类型的值:原始类型的数据会转换成数值类型再进行比较。字符串和布尔值都会转换成数值。
2、对象与原始类型值比较:对象(这里指广义的对象,包括数值和函数)与原始类型的值比较时,对象转化成原始类型的值,再进行比较。
3、undefined和null:undefined和null与其他类型的值比较时,结果都为false,它们互相比较时结果为true。

详细说明:
1、如果两个值类型相同,进行 === 比较。
2、如果两个值类型不同,他们可能相等。根据下面规则进行类型转换再比较:

  1. 如果一个是null、一个是undefined,那么[相等]。
  2. 如果一个是字符串,一个是数值,把字符串转换成数值再进行比较。
  3. 如果任一值是 true,把它转换成 1 再比较;如果任一值是 false,把它转换成 0 再比较。
  4. 如果一个是对象,另一个是数值或字符串,把对象转换成基础类型的值再比较。对象转换成基础类型,利用它的toString或者valueOf方法。 js核心内置类,会尝试valueOf先于toString;例外的是Date,Date利用的是toString转换。
  5. 任何其他组合,都[不相等]。

举例:

"1" == true;
类型不等,true会先转换成数值 1,现在变成 "1" == 1,再把"1"转换成 1,比较 1 == 1, 相等。
'' == '0'           // false
0 == ''             // true
0 == '0'            // true
false == 'false'    // false
false == '0'        // true
false == undefined  // false
false == null       // false
null == undefined   // true
' \t\r\n ' == 0     // true

四、== 中的坑

举例:

function fix(n) {
    if (n == 0) return n + 1;
    return n + 2;
}

如果输入n为字符串值"0"的话,最后的将会得到字符串"01"作为返回值,而不是你想要的数字1。所以一句话概括:没有类型限制,类型转换的后果将是不可预料的。

五、总结

1、编程建议:尽量使用严格运算符 ===。因为"=="不严谨,可能会带来一些违反直觉和意想不到的后果。
2、少用==:因为没有类型限制,类型转换的后果将是不可预料的。

猜你喜欢

转载自blog.csdn.net/madman0621/article/details/82932729