视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
javascript中关于类型判断的一些疑惑小结
2020-11-27 22:06:12 责编:小采
文档


前言

类型判断是我们在日常工作中经常会遇到的一个功能,本文将给大家详细介绍关于javascript类型判断的相关内容,下面话不多说了,来一起看看详细的介绍吧

Javascript中数据类型分为两种:

  • 简单数据类型:Undefined, NULL, Boolean, Number, String
  • 复杂数据类型:Object
  • 接下来我们就来看看怎么做数据类型判别吧?

    首先来看看 typeof

    Type Result
    Undefined "undefined"
    Null "object" (see below)
    Boolean "boolean"
    Number "number"
    String "string"
    Symbol (new in ECMAScript 2015) "symbol"
    Host object (provided by the JS environment) Implementation-dependent
    Function object (implements [[Call]] in ECMA-262 terms) "function"
    Any other object "object"

    来点code demo吧

    let a = undefined;
    typeof a
    "undefined"
    
    let b = false;
    typeof b
    "boolean"
    
    let c = 12;
    typeof c
    "number"
    
    let d = '12';
    typeof d
    "string"
    
    let f = function () {};
    typeof f
    "function"

    接下来我们就来看看那些奇怪的现象吧

    let str = new String('abc');
    typeof str
    "object"
    
    let num = new Number(12);
    typeof num
    "object"
    
    var func = new Function();
    typeof func; 
    "function"
    
    typeof null
    "object"

    使用构造函数创建的变量,使用typeof判断会返回“object”结果,但是Function函数例外,由它创建的变量typeof返回的是“function”

    接着就来说说typeof null == "object"。这个相信前端开发的小伙伴都知道是这个结果了,But why? 这其实是javascript第一个版本就存在的一个bug,历史原因可以看看这篇文章The history of typeof null

    关于如何判断数组

    let arr = [1, 2, 3];
    typeof arr
    "object"

    上面这个结果大家应该不陌生,那该如何正确判断数组类型呢

    1、instanceof

    arr instanceof Array //true

    2、isArray

    Array.isArray(arr) // true

    3、constructor.name

    arr.constructor.name // "Array"

    第三种用法用的人应该比较少,不少前端的的小伙伴都没用过。对于复杂类型Object,它的每个实例都有constructor属性。

    instanceof vs isArray

    当检测Array实例时, Array.isArray 优于 instanceof,因为Array.isArray能检测iframes.

    var iframe = document.createElement('iframe');
    document.body.appendChild(iframe);
    xArray = window.frames[window.frames.length-1].Array;
    var arr = new xArray(1,2,3); // [1,2,3]
    
    // Correctly checking for Array
    Array.isArray(arr); // true
    // Considered harmful, because doesn't work though iframes
    arr instanceof Array; // false

    这段代码是从MDN copy的。补充以下结果,发现第三种方法constructor.name也能正确判断出。

    arr.constructor.name //"Array"

    关于NaN

    使用isNaN判断NaN。

    isNaN(1/'a') // true

    我们知道NaN == NaN结果是false,那如何判断两个NaN变量呢?

    比较两个NaN变量,使用es6的Object.is()即可。

    let nan1 = NaN
    let nan2 = NaN
    Object.is(nan1, nan2)
    true

    总结

    下载本文
    显示全文
    专题