zoukankan      html  css  js  c++  java
  • js判断数据类型

    又是好久没有写博客了,但一直都在坚持写笔记,笔记里的东西还是不拿出来献丑了,自己一个人看就好了,哈哈~

    js中判断数据类型有很多种,今天我就整理一下我所知道的方法。

    1.typeof

    首先在控制台试试下面的几道小题

    typeof null //object
    typeof undefined // undefined
    typeof false // boolean
    typeof 123 // number
    typeof 'abc' //string

    ok,五种基本数据类型,除了null,其他的输出不用解释。

    null被认为是一个空对象引用,所以,会返回object,这算是一个语言实现的错误。

    再来看下面的例子

    typeof new Number(12); //object
    typeof Number(13) //number
    typeof NaN // number

    此例子还可以用String和Boolean试一下,都是可以的。

    解释一下:
        第一个虽然Number,String,Boolean是基本数据类型,但他们可以通过new创建,而通过new创建,后台会自动转化为对象,使他们看起来像对象。因此,第一个是返回object
        第二个由于没有用new,创建的就是基本数据类型,所以还是number类型
        第三个NaN是属于Number类型的,这里需要注意NaN与任何数据都不相等,包括它本身。

    再试试用typeof判断引用类型

    typeof {} //object
    typeof /d/ //object
    typeof [] //object
    typeof new Date() //object
    typeof function() {} //function

    可见使用typeof除了判断function是精确的,而其他引用型数据都是object,但需要注意的是在有些低版本浏览器,会将正则误判断为function。

    因此,又有了instanceof判断引用类型。

    2.instanceof

    ({}) instanceof Object;             //以下都为true
    [] instanceof Array                   
    (new Date()) instanceof Date    
    (function() {}) instanceof Function    
    (/d/) instanceof RegExp           

    恩,很好,完全可以是我们所想要的方法。顺便看看下面的例子:

    new Number(12) instanceof Number // true
    Number(13) instanceof Number // false
    123 instanceof Number // false

    嘿嘿。不对了吧,这就需要提到instanceof的原理了,instanceof其实是用来判断一个变量是否为某个对象的实例。

    解释一下

        正如上面说所说,基本数据类型通过使用new创建时,会在后台转化为对象,使他们看起来像对象,

        第一个用new创建所以是Number的实例,返回true

        第二个只是用Number()创建数字,是基本类型,不是Number的实例

        第三个更不用说啦!

    还有一种方法是使用constructor

    3.constructor

    constructor可以返回对象相应的构造函数

    [].constructor == Array;               //以下都为true
    {}.constructor == Object;
    "string".constructor == String;
    (123).constructor == Number;
    true.constructor == Boolean;

    但是,需要注意的是方法2和方法3必须是在当前页面声明。因为,他们假定都是只有一个全局执行环境的。如果一个页面使用多个框架,那么就存在两个以上的全局执行环境,也就存在两个以上不同版本的Array构造函数。如果当我们使用一个框架向另一个框架传入数组,那么,他们具有不同的构造函数,因此,会影响判断结果。

    那么,如何简单而又准确判断数据类型呢?下面方法是我常用的。

    4.Object.prototype.toString.call() 

    Object.prototype.toString.call() === '[object String]'  //true  其他类型(包括基本类型)就不一一验证了

    调用Obeject原型上的toString方法,该方法获取this对象上的[[Class]]属性,这个属性会返回该对象的类型。
    用上面的方法可以较准确的判断数据类型,这也是我经常使用判断引用类型的方法

    以下参考自http://www.cnblogs.com/mofish/p/3388427.html

    5.使用特性判断

    例如:

    function isArray(obj) {
        return obj 
               && typeof obj === 'object'
               && typeof obj.length === 'number'
               && typeof obj.splice === 'function'
               && !(obj.propertyIsEnumerable('length'));
    }

    有length和splice并不一定是数组,因为可以为对象添加属性,而不能枚举length属性,才是最重要的判断因子。

    此外,如果是要判断数组,还可以使用ES5里的方法Array.isArray();

    这些是我目前知道的,如果有更好的方法求赐教~~有什么不对的地方求指教~~

  • 相关阅读:
    一行代码更改博客园皮肤
    fatal: refusing to merge unrelated histories
    使用 netcat 传输大文件
    linux 命令后台运行
    .net core 使用 Nlog 配置文件
    .net core 使用 Nlog 集成 exceptionless 配置文件
    Mysql不同字符串格式的连表查询
    Mongodb between 时间范围
    VS Code 使用 Debugger for Chrome 调试vue
    css权重说明
  • 原文地址:https://www.cnblogs.com/nalixueblog/p/4692937.html
Copyright © 2011-2022 走看看