• Js中==与===


    Js中==与===

    JavaScript中提供==相等运算符与===严格相等运算符,建议是只要变量的数据类型能够确定,一律使用===

    ==相等运算符

    ==在判断相等时会进行隐式的类型转换, 其比较遵循一些原则,即先转换类型再比较

    1. 如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值,即是调用Number()方法
    2. 如果一个操作数是字符串,另一个是数值,在比较相等性之前先将字符串转换为数值,同样调用Number()方法
    3. 如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()toString()方法把对象转换成基础类型的值再比较,除Date对象外,会优先尝试使用valueOf()方法,用得到的基本类型按照前面的规则进行比较。
    4. 以及null == undefined,此外任何其他组合,都不相等。
    1 == true //true // Number Boolean
    2 == true //false
    1 == "1"  //true // Number String
    [] == ""  //true // Object String
    [] == false // true // Object Boolean
    [] == 0   //true // Object Number
    [] == {}  //false
    [] == []  //false
    {} == {}  //false
    null == undefined //true
    

    在使用的时候可能会出现一些问题

    0 == "0"  //true
    0 == []   //true
    "0" == [] // false
    

    如果是直接实现了valueOf()toString()的方法,而不是调用原型链上的Object.prototype.valueOf()Object.prototype.toString()方法,甚至能够产生异常。

    var obj = {valueOf: function(){ return {} }, toString: function(){ return {}}}
    console.log(obj == 0) // Uncaught TypeError: Cannot convert object to primitive value
    

    ===严格相等运算符

    ===先判断类型再比较,类型不同直接不相等
    ES6数据类型有NumberStringBooleanObjectSymbolnullundefined

    1 === true //false
    1 === "1"  //false
    [] === ""  //false
    null === undefined //false
    

    if

    if()也可以看作是一个单独的运算符类别

    if(true) console.log("exec"); //exec
    if(false) console.log("exec");
    if(1) console.log("exec"); //exec
    if(0) console.log("exec"); 
    if(-1) console.log("exec"); //exec
    if("true") console.log("exec"); //exec
    if("1") console.log("exec"); //exec
    if("0") console.log("exec"); //exec
    if("") console.log("exec");
    if(null) console.log("exec");
    if(undefined) console.log("exec");
    if("null") console.log("exec"); //exec
    if("undefined") console.log("exec"); //exec
    if([]) console.log("exec"); //exec
    if({}) console.log("exec"); //exec
    if([0]) console.log("exec"); //exec
    if(NaN) console.log("exec");
    

    参考

    https://www.zhihu.com/question/31442029
    https://dorey.github.io/JavaScript-Equality-Table/#three-equals
    
  • 相关阅读:
    Makefile:(实验)多个目标匹配时会采用最完整匹配的目标
    线程调度为什么比进程调度更少开销?
    关于makefile中自动产生依赖的理解
    makefile中重载与取消隐藏规则示例
    xargs命令的使用过程中一个小领悟:管道与xargs的差别
    CODING 远程办公 开工不断线
    【 ECUG 演讲分享】吴海黎:CODING 微服务架构演进之路
    张海龙:云时代企业研发人员需求与人才培养
    腾讯云大学 x CODING | DevOps 实战:Jenkins Docker
    腾讯云大学 x CODING | 敏捷开发与 DevOps 实战
  • 原文地址:https://www.cnblogs.com/WindrunnerMax/p/12619512.html
Copyright © 2020-2023  润新知