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

    一。数据类型

    基本类型(值类型):

    1. Undefined

    2. Null

    3. Boolean

    4. NaN

    5. String

    复杂类型(引用类型) :

    1. Object

    2. Array

    3. Date

    4. RegExp

    5. Function

    二。值类型与引用类型的差别

    基本类型在内存中占据固定大小的空间,因此被保存在栈内存中

    从一个变量向另一个变量复制基本类型的值,复制的是值的副本

    引用类型的值是对象,保存在堆内存

    包含引用类型值的变量实际上包含的并不是对象本身,而是一个指向该对象的指针

    从一个变量向另一个变量复制引用类型的值的时候,复制是引用指针,因此两个变量最终都指向同一个对象

    三。判断数据类型

    方案一:js内置方法typeof

      检测基本数据类型的最佳选择是使用typeof

    typeof 来判断数据类型,只能区分基本类型,即 “number”,”string”,”undefined”,”boolean”,”object”,“function”,“symbol” (ES6新增)七种。

    对于数组、null、对象来说,其关系错综复杂,使用 typeof 都会统一返回 “object” 字符串。

      

    var bool = true
    var num = 1
    var str = 'abc'
    var und = undefined
    var nul = null
    var arr = [1,2,3]
    var obj = {}
    var fun = function(){}
    var reg = new RegExp()
    
    console.log(typeof bool); //boolean
    console.log(typeof num); //number
    console.log(typeof str); //string
    console.log(typeof und); //undefined
    console.log(typeof nul); //object
    console.log(typeof arr); //object
    console.log(typeof obj); //object
    console.log(typeof reg); //object
    console.log(typeof fun); //function
    
    由结果可知,除了在检测null时返回 object 和检测function时放回function。对于引用类型返回均为object

    方案二:Object.prototype.toString()

       Object.prototype.toString方法返回对象的类型字符串,因此可以用来判断一个值的类型 

    var obj = {};
    obj.toString() // "[object Object]"
    
    上面代码调用空对象的toString方法,结果返回一个字符串object Object,其中第二个Object表示该值的构造函数。这是一个十分有用的判断数据类型的方法。

    Object.prototype.toString.call(value)

    上面代码表示对value这个值调用Object.prototype.toString方法。

    不同数据类型的Object.prototype.toString方法返回值如下。

    数值:返回[object Number]。
    字符串:返回[object String]。
    布尔值:返回[object Boolean]。
    undefined:返回[object Undefined]。
    null:返回[object Null]。
    数组:返回[object Array]。
    arguments 对象:返回[object Arguments]。
    函数:返回[object Function]。
    Error 对象:返回[object Error]。
    Date 对象:返回[object Date]。
    RegExp 对象:返回[object RegExp]。
    其他对象:返回[object Object]。

    那么利用这个特性,可以写出一个比typeof运算符更准确的类型判断函数。

    封装出一个判断类型的函数如下:

    var type = function (o){
      var s = Object.prototype.toString.call(o);
      return s.match(/[object (.*?)]/)[1].toLowerCase();
    };
    type({}); // "object"
    type([]); // "array"
    type(5); // "number"
    type(null); // "null"
    type(); // "undefined"
    type(/abcd/); // "regex"
    type(new Date()); // "date"

    另外:还可以加上专门判断某种类型数据的方法

    var type = function (o){
      var s = Object.prototype.toString.call(o);
      return s.match(/[object (.*?)]/)[1].toLowerCase();
    };
    
    var arr = ['Null', 'Undefined', 'Object', 'Array', 'String', 'Number', 
     'Boolean', 'Function', 'RegExp']
    
    arr.forEach(function (t) {
      type['is' + t] = function (o) {
        return type(o) === t.toLowerCase();
      };
    });

    之后我们可以通过封装出的方法去在不同需求时使用:如下

    type.isObject({}) // true

    type.isNumber(NaN) // true

    type.isRegExp(/abc/) // true

  • 相关阅读:
    字符编码相关
    函数之形参与实参
    文件操作模式
    函数对象,名称空间,作用域,和闭包
    吴裕雄天生自然SPRINGBOOT开发实战处理'spring.datasource.url' is not specified and no embedded datasource could be autoconfigured
    吴裕雄天生自然SPRINGBOOT开发实战处理XXXX that could not be found.
    吴裕雄天生自然SPRINGBOOT开发实战SpringBoot HTML表单登录
    吴裕雄天生自然SPRINGBOOT开发实战SpringBoot REST示例
    吴裕雄天生自然SpringBoot开发实战学习笔记处理 Could not write metadata for '/Servers'.metadata\.plugins\org.eclipse.core.resources\.projects\Servers\.markers.snap (系统找不到指定的路径。)
    吴裕雄天生自然SPRINGBOOT开发实战SpringBoot Tomcat部署
  • 原文地址:https://www.cnblogs.com/forever-xuehf/p/12774976.html
Copyright © 2011-2022 走看看