zoukankan      html  css  js  c++  java
  • JS 中对变量类型的五种判断方法

    5种基本数据类型:undefined、null、boolean、unmber、string

    复杂数据类型:object、

    object:array、function、date等

    方法一:使用typeof检测

    当需要变量是否是number,string,boolean

    ,function,undefined,json类型时,可以使用typeof进行判断;其他变量是判断不出类型的,包括null。

    typeof是区分不出array和json类型的,因为使用typeof这个变量时,array和json类型输出的都是object

    方法二:使用instance检测

    在 JavaScript 中,判断一个变量的类型尝尝会用 typeof 运算符,在使用 typeof 运算符时采用引用类型存储值会出现一个问题,无论引用的是什么类型的对象,它都返回 “object”。ECMAScript 引入了另一个 Java 运算符 instanceof 来解决这个问题。instanceof 运算符与 typeof 运算符相似,用于识别正在处理的对象的类型。与 typeof 方法不同的是,instanceof 方法要求开发者明确地确认对象为某特定类型

    instanceof还能检测出多层继承的关系,例如:

    function Person(){

    }

    function Student(){

    }

    Student.prototype = new Person();

    var John = new Student();

    console.log(John instanceof Student); // true

    console.log(John instancdof Person);  // true

    方法三:使用constructor检测

    constructor本来是原型对象上的属性,指向构造函数。但是根据实例对象寻找属性的顺序,若实例对象上没有实例属性或方法,就去原型链上寻找,因此,实例对象也是能使用constructor属性的

    因为undefined和null没有constructor属性,所以不能使用constructor判断

    看下面的例子:

    function Person(){

    }

    function Student(){

    }

    Student.prototype = new Person();

    var John = new Student();

    console.log(John.constructor==Student); // false

    console.log(John.constructor==Person);  // true

    在上面的例子中,Student原型中的constructor被修改指向到Person,导致检测不出实例对象John真实的构造函数

    同时,使用instaceof和construcor,被判断的array必须是在当前页面声明的!比如,一个页面(父页面)有一个框架,框架中引用了一个页面(子页面),在子页面中声明了一个array,并将其赋值给父页面的一个变量,这时判断该变量,Array == object.constructor;会返回false;

    原因:

    1、array属于引用型数据,在传递过程中,仅仅是引用地址的传递。

    2、每个页面的Array原生对象所引用的地址是不一样的,在子页面声明的array,所对应的构造函数,是子页面的Array对象;父页面来进行判断,使用的Array并不等于子页面的Array;切记,不然很难跟踪问题!

    方法四:使用Object.prototype.toString.call

    Object.prototype.toString.call(变量)输出的是一个字符串,字符串里有一个数组,第一个参数是Object,第二个参数就是这个变量的类型,而且,所有变量的类型都检测出来了,我们只需要取出第二个参数即可。或者可以使用Object.prototype.toString.call(arr)=="object Array"来检测变量arr是不是数组。

    方法五:jquery中$.type的实现

    jquery中就是用Object.prototype.toString.call实现的,把'[object Boolean]'类型转成'boolean'类型并返回

  • 相关阅读:
    HDU 5791 Two (DP)
    POJ 1088 滑雪 (DPor记忆化搜索)
    LightOJ 1011
    POJ 1787 Charlie's Change (多重背包 带结果组成)
    HDU 5550 Game Rooms (ccpc2015 K)(dp)
    HDU 5542 The Battle of Chibi (ccpc 南阳 C)(DP 树状数组 离散化)
    HDU 5543 Pick The Sticks (01背包)
    HDU 5546 Ancient Go (ccpc2015南阳G)
    NB-IoT的DRX、eDRX、PSM三个模式 (转载,描述的简单易懂)
    MQTT 嵌入式端通讯协议解析(转)
  • 原文地址:https://www.cnblogs.com/twoeggg/p/8046167.html
Copyright © 2011-2022 走看看