zoukankan      html  css  js  c++  java
  • JS中的“==”与强制类型转换

    JavaScript中有“==”与“===”,那么他们有何区别呢?

    对于基本数据类型, ===  (!==)只有当两个变量的类型和值都相等时,才返回true;而 == (!=)则会对变量进行强制类型转换,只要转换后的值相等,则换回true。

    下面结合代码讲一下在转换不同的数据类型时,相等 == 和不相等 != 操作符遵循的强制转型基本规则

    1. 如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值:false转换为0,而true转换为1;

    false == 0   //true
    true == 1   //true
    true == 3   //false

    2. 如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值;

    "123" == 123   //true

    3. 如果一个操作数是对象,另一个操作数不是,则调用对象的valueof ()方法,用得到的基本类型值按照前面的规则进行比较;

    var a = [ 1 , 2 , 3 ]
    alert(a == "1,2,3")   //true, a.valueOf()为"1,2,3"

    需要注意的是:

    a. null和undefined是相等的,null和undefined不能转换成其他任何值;

    null == undefined   //true
    undefined == 0   //false
    null == 0   //false
    undefined == false   //false
    null == false   //false

    b. 如果有一个操作数是NaN,则相等操作符 == 返回false,而不相等操作符 != 返回true。

    tips:即使两个操作数都是NaN,相等操作符 == 也返回false;因为按照规则, NaN不等于NaN。

    NaN == NaN   //false
    NaN != NaN   //true
    NaN == 0   //false

    c. 如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符返回true;否则,返回false。

    var obj = new Object()
    var obj1 = new Object()
    var obj2 = obj
    alert(obj == obj1) //false
    alert(obj == obj2) //true
    alert(obj === obj1) //false

    那么除此之外,还有什么情况下JS代码需要对变量进行强制转型呢?

      1. 字符串拼接时:

    var a = 1 + 1   // 2
    var b = 1 + "1"   //11

      2. if语句判断时:

    if(100){
        alert(100)   //会执行
    }
    if(!0){
        alert(0)   //不会执行
    }
    if(!null){
        alert(null)   //不会执行
    }
    if(!undefined){
        alert(undefined)   //不会执行
    }

      3. 逻辑运算符

    alert(100 && 0)   //0
    alert('' || 'ab')   //'ab'
    alert(!0)   //true
    alert(!!100)   //true

      PS: && (逻辑与)和 || 这两逻辑运算符不一定返回布尔值,且都遵循着短路原则。明天单独写一篇随笔好了~

    那么我们什么时候使用 == 什么时候使用 === 呢?

      答:由于相等 == 和不相等操作符!= 存在类型转换的问题,为了保持代码中数据类型的完整性,红宝书推荐我们尽量使用全等 === 和不全等 != 操作符。而JQuery中有一种这样的写法:

    if(obj.a == null){
        //相当于 obj.a === null || obj.a === undefined的简写形式
    }

    除此之外,我们全部使用 ===。

    如有错误,欢迎指出探讨。

  • 相关阅读:
    javaApi Swagger配置
    java跨域配置
    applation.properties与applation.yml关于sql数据库连接配置的区别
    SpringBoot学习记录一
    Centos命令行报bash:.....:command not found的解决办法
    Referenced file contains errors (http://JAVA.sun.com/xml/ns/j2ee/web-app_2_5.xsd).
    C# 两种封装的区别
    此 ObjectContext 实例已释放,不可再用于需要连接的操作。
    .net MVC ajax传递数组
    正则表达式移除首部尾部多余字符
  • 原文地址:https://www.cnblogs.com/YiNongLee/p/9261153.html
Copyright © 2011-2022 走看看