美文网首页
在JavaScript中为什么推荐使用 === 运算符

在JavaScript中为什么推荐使用 === 运算符

作者: 微风玉米 | 来源:发表于2017-06-12 22:04 被阅读0次

    ​在JavaScript 中存在着三种等号运算符,分别为:= ;== ;=== 。一个等号的是赋值运算符, 两个等号的是相等运算符,三个等号的是严格相等运算符。后两者是今天讨论的主角,因为JavaScript 提供了两种相等运算符,那么我们在进行比较运算时,应该优先使用哪种相等运算符呢?为什么优先使用?为了解答这个问题,对于这两个运算符,我们要有一个大概的了解。

    相等运算符(==)

    运算结果为布尔值(true 或者 false),相等时返回 true,不相等时返回 false 。但使用这个比较运算符时要注意当两者类型不同时也有可能会返回true。

    假设比较x 和 y ( x == y ):

    1. 当x 和 y 的数据类型相同时
      • 如果x 和 y 都是基本数据类型(字符串、数值、undefined、null、boolean),当字面上的值相同,就返回true,否则返回 false。(比较的是值)
      • NaN 与任何值比较都返回 false ,包括它自己。
      • 如果 x 和 y 都是复合数据类型,当 x 和 y 都是引用同一个对象,就返回true,否则返回 false。(比较的是地址)
    2. 当x 和 y 的数据类型不同时
      • 如果 x 为 null, y 为 undefined,就返回 true,比较结束。
      • 如果 x 为 undefined,y 为 null,返回 true,比较结束。
      • x 或 y 其中一个为 null 或 undefined,而另外一个是null 和undefined 之外的类型,就返回 false,比较结束。
      • 如果 x 为 Number 类型,y 为 String 类型,就先用Number() 函数将 y 转换为数值,再进行类型相同比较。
      • 如果 x 为 String 类型,y 为 Number 类型,就先用Number() 函数将 x 转换为数值,再进行类型相同比较。
      • x 或 y 其中一个为Boolean 类型,就先用Number() 函数将 Boolean 转换为数值,然后进行后续比较。
      • x 或 y 其中一个为Object 类型,就先调用 Object 的valueOf() 方法,如果返回的是基本数据类型 ,那么就回到前面几种情况的比较,否则调用Object 的toString() 方法,如果返回的是基本数据类型,那么就回到前面几种情况的比较,否则比较结束,结果为 false。

    例子:

    var obj1 = {valueOf: function(){return 1}};
    var obj2 = {valueOf: function(){return 1}};
    1 == obj1 //true
    obj1 == obj2 // false
    
    var obj3 = {valueOf: function(){return null}};
    0 == null // false
    null == obj3 // false
    null == undefined //true
    undefined == null //true
    
    var obj4 = {name: 'michael'};
    0 == obj4 //false
    '' == obj4 //false
    
    var obj5 ={valueOf: function(){return undefined}};
    undefined == obj5 //false
    0 == undefined //false
    
    0 == '' //true
    123 == '123' //true
    '0' == false //true
    

    严格相等运算符

    严格相等运算符的比较过程就比较简单了,比较过程内部不会发生类型转换。

    如果比较的双方类型不同就直接返回 false,比较结束。

    如果比较的双反类型相同,则:

    • 如果x 和 y 都是基本数据类型(字符串、数值、undefined、null、boolean),当字面上的值相同,就返回true,否则返回 false。(除了NaN)
    • NaN 与任何值比较都返回 false ,包括它自己。
    • 如果 x 和 y 都是复合数据类型,当 x 和 y 都是引用同一个对象,就返回true,否则返回 false。

    例子:

    0 === false //false
    null === undefined //false
    0 === '' //false
    NaN === NaN //false
    [0] === 0 //false
    

    总结

    个人认为在JavaScript 中用 ===== 进行比较运算各有利弊,使用 == 进行比较会使比较原则更宽松,减少了类型转换的麻烦,但是有时会产生混乱,不知道过程发生了什么。而=== 比较会更严格,因为内部不会发生类型转换,我们可以进行准确的预测,避免不必要的麻烦,所以个人推荐在JavaScript 中使用=== 进行相等比较。

    相关链接

    1. Angus Croll blog
    2. https://www.impressivewebs.com/why-use-triple-equals-javascipt/
    3. JavaScript 中应该用 "==" 还是 "==="?———来自知乎

    相关文章

      网友评论

          本文标题:在JavaScript中为什么推荐使用 === 运算符

          本文链接:https://www.haomeiwen.com/subject/sgjrqxtx.html