美文网首页
数据类型(二)

数据类型(二)

作者: 隔壁桌的郑先生 | 来源:发表于2018-08-28 16:30 被阅读0次

    前言:在JavaScript中,各种数据类型和情况下在“if”中的判断总结。

    (1)基本类型判断

    • 字符串类型
    var  t = '';
    if (t) {
         console.log("true");
    } else {
         console.log("false");
    } //false
    
    var  t=" ";
    if (t) {
         console.log("true");
    } else {
         console.log("false");
    } //true
    

    结论:非空即为真

    • 数据类型
    var  t = 0;
    if (t) {
         console.log("true");
    } else {
         console.log("false");
    } //false, t=0.0亦如此
    
    var  t = NaN;
    if (t) {
         console.log("true");
    } else {
         console.log("false");
    } //false
    
    var  t = Infinity;
    if (t) {
         console.log("true");
    } else {
         console.log("false");
    } //true
    

    结论:非零,非NaN为真

    • Null和Undefined类型
    var  t = null;
    if (t) {
         console.log("true");
    } else {
         console.log("false");
    } //false, t=0.0亦如此
    
    var  t = undefined;
    if (t) {
         console.log("true");
    } else {
         console.log("false");
    } //false, t=0.0亦如此
    

    结论:null和undefined都是假

    (2)复杂数据类型判断

    • 函数
    function testfunction ()  {
    };
    if (testfunction)  {
         console.log("true");
    } else {
         console.log("false");
    } //true
    
    function testfunction () {
    };
    if (testfunction())  {
         console.log("true");
    } else {
         console.log("false");
    } //false,因为无返回值,即为undefined
    
    function testfunction () {
      return function () {
      };
    };
    if (testfunction())  {
         console.log("true");
    } else {
         console.log("false");
    } //true
    

    结论:只要是已定义的函数对象即为真,若是调用函数,则根据返回值的结果做判断

    • 数组和对象
    var t = {};
    if (t)  {
         console.log("true");
    } else {
         console.log("false");
    } //true
    
    var t = [];
    if (t)  {
         console.log("true");
    } else {
         console.log("false");
    } //true
    
    var t = {a:[]};
    if (t.a)  {
         console.log("true");
    } else {
         console.log("false");
    } //true
    

    结论:只要是已定义的数组和对象,不管有无内容,都为真,但获取其属性字段,则按字段值结果做判断。

    总结:null和undefined是假。对于数值类型,非零和非NaN是真;对于字符类型除空字符串是假,其他都为真,对于对象和方法属性,如果定义了就是真,否则就是假,其他所有情况都可以看做是对null和undefined的判断的变相应用;

    (3)特殊情况下的if判断

    • null和undefined之间的判断
    if (null == undefined)  {
         console.log("true");
    } else {
         console.log("false");
    } //true
    
    if (null === undefined)  {
         console.log("true");
    } else {
         console.log("false");
    } //false
    

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

    a、如果一个是null、一个是undefined,那么相等
    b、如果一个是字符串,一个是数值,把字符串转换成数值再进行比较。
    c、如果任一值是 true,把它转换成 1 再比较;如果任一值是 false,把它转换成 0 再比较。
    d、如果一个是对象,另一个基本类型,把对象转换成基础类型的值再比较。对象转换成基础类型,利用它的toString或者valueOf方法。js核心内置类,会尝试valueOf先于toString

    20161108164017219.png

    怎么看?

    红色:===
    橙色:==
    黄色:<= 和 >= 同时成立,== 不成立
    蓝色:只有 >=
    绿色:只有 <=
    白色:不成立

    结论:在"=="比较的时候会转换数据类型,而"==="比较严格,只要类型不同即判断为假。在实际中,undefined是派生于null的,因此在js标准中规定两者在"=="情况下的相等性测试结果为真。这也是为何在做相等性测试时候使用"===".

    • NaN和undefined和null之间的判断
    if (NaN == undefined)  {
         console.log("true");
    } else {
         console.log("false");
    } //false
    
    if (NaN == null)  {
         console.log("true");
    } else {
         console.log("false");
    } //false
    
    if (NaN == NaN)  {
         console.log("true");
    } else {
         console.log("false");
    } //false
    

    结论:NaN连与自身都不相等

    • 引用类型之间的判断
    // 对象赋值
    var a = {}; 
    var b = a;  
    if (a === b)  {
         console.log("true");
    } else {
         console.log("false");
    } //true
    
    // 对象直接定义
    var a = {}; 
    var b = {};  
    if (a === b)  {
         console.log("true");
    } else {
         console.log("false");
    } //false
    
    // 浅拷贝
    var a = { a: {a: "hello"} };
    var b = Object.assign({}, a);
    if (a === b)  {
         console.log("true");
    } else {
         console.log("false");
    } //false
    
    // 深拷贝
    var a = {
      c: 1
    };
    var b = JSON.parse(JSON.stringify(obj));
    if (a === b)  {
         console.log("true");
    } else {
         console.log("false");
    } //false
    
    // new方式创建实例
    function a () {};
    var b = new a;
    if (a === b)  {
         console.log("true");
    } else {
         console.log("false");
    } //false
    

    结论:引用类型的比较是引用的比较,也就是内存堆指针的比较,所以无论是哪种拷贝还是创建实例,只要在内存堆里开辟了新空间的变量比较的时候都是为假。

    相关文章

      网友评论

          本文标题:数据类型(二)

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