• 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();

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

  • 相关阅读:
    hdu 4612 Warm up 双连通缩点+树的直径
    Hadoop-04-HBase全然分布式环境搭建
    java实现的Trie树数据结构
    Sharpui企业版-简单介绍【01】 【QQ群:206378966】
    Apache Mina开发手冊之四
    POJ训练计划1459_Power Network(网络流最大流/Dinic)
    svn+ssh
    Android首席设计师宣称移动概念已死,开发人员应该面向屏幕编写应用而非移动
    连锁快餐企业软件的一些管理
    多进程解决datasnap支持的tcp长连接数量少的问题
  • 原文地址:https://www.cnblogs.com/nalixueblog/p/4692937.html
Copyright © 2020-2023  润新知