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

    常用判断方法:

    1. typeof

    typeof 共返回6种数据格式,只能判断区分基本类型: number、string、boolean、undefined、object 以及 function

    typeof 0;             //number
    typeof true;          //boolean
    typeof "string";      //string
    
    typeof undefined;         //undefined
    typeof function(){};      //function
    
    typeof null;   //object
    typeof {};     //object
    typeof [];     //object    

    对象和数组 无法区分。

    2. instanceof

    instanceof 运算符用来检测 右侧 constructor.prototype 是否存在于 左侧参数 object 的原型链上。即:

    A instanceof B   // 检测构造函数B的原型是否有出现在对象A的原型链上。

    因此,instanceof 运算符只能用于对象,不能用于原始类型的值

    let a = true
    let b = new Boolean(true)
    a instanceof Boolean          // false
    b instanceof Boolean          // true

    检测引用类型时,对于数组的校验也是不尽人意

    let c={};
    c instanceof Object   //true
    c instanceof Array    //false
    let d=[];
    d instanceof Object   //true
    d instanceof Array    //true

    3. constructor

    constructor可以区分Array和Object,也能支持各种类型的判断,如下

    (1).constructor === Number                     // true
    (true).constructor === Boolean                 // true
    ('string').constructor === String              // true
    ([]).constructor === Array                     // true
    (function() {}).constructor === Function       // true
    ({}).constructor === Object                    // true

    但是,存在两大缺陷

    (1)null 和 undefined 是无效的对象,不存在 constructor ,无法以此来作判断。

    (2)constructor 是不稳定的,这个主要体现在把类的原型进行重写,在重写的过程中很有可能出现把之前的 constructor 给覆盖了,这样检测出来的结果就是不准确的

    function Fn(){};
     
    Fn.prototype=new Array();
     
    var f=new Fn();
     
    console.log(f.constructor===Fn);    // false
    console.log(f.constructor===Array); // true

    4. Object.prototype.toString.call()

    最准确最常用的方式。先获取 Object 原型上的 toString 方法,让方法执行,让 toString 方法中的 this 指向第一个参数的值。

    Object.prototype.toString.call(1)
    //"[object Number]"
    
    Object.prototype.toString.call('string')
    //"[object String]"
    
    Object.prototype.toString.call(true)
    //"[object Boolean]"
    
    Object.prototype.toString.call([])
    //"[object Array]"
    
    Object.prototype.toString.call({})
    //"[object Object]"
    
    Object.prototype.toString.call(function(){})
    //"[object Function]"
    
    Object.prototype.toString.call(undefined)
    //"[object Undefined]"
    
    Object.prototype.toString.call(null)
    //"[object Null]"

    prototype.js 中用于获取对象的类型名

    /**
     * Returns internal [[Class]] property of an object
     *
     * Ecma-262, 15.2.4.2
     * Object.prototype.toString( )
     *
     * When the toString method is called, the following steps are taken: 
     * 1. Get the [[Class]] property of this object. 
     * 2. Compute a string value by concatenating the three strings "[object ", Result (1), and "]". 
     * 3. Return Result (2).
     *
     * __getClass(5); // => "Number"
     * __getClass({}); // => "Object"
     * __getClass(/foo/); // => "RegExp"
     * __getClass(''); // => "String"
     * __getClass(true); // => "Boolean"
     * __getClass([]); // => "Array"
     * __getClass(undefined); // => "Window"
     * __getClass(Element); // => "Constructor"
     *
     */
    function __getClass(object){
      return Object.prototype.toString.call(object).match(/^[objects(.*)]$/)[1];
    };

    借此,可扩展为 js 工具:

    var is ={
      types : ["Array", "Boolean", "Date", "Number", "Object", "RegExp", "String", "Window", "HTMLDocument"]
    };
    for(var i = 0, c; c = is.types[i]; i ++){
      is[c] = (function(type){
        return function(obj){
          return Object.prototype.toString.call(obj) == "[object " + type + "]";
        }
      })(c);
    }
    console.log(is.Array([]));       // true
    console.log(is.Date(new Date));    // true
    console.log(is.RegExp(/reg/ig));   // true
  • 相关阅读:
    Objectivec中的@property和@synthesize详解
    objectc笔记
    iOS常用开源框架之ASIHTTPRequest
    oschina引用库说明
    UITableView的重用机制
    iOS常用开源框架之AFNetworking
    ObjectiveC中@class和#import的区别
    Python中文文档 目录(转载)
    关于Console 2窗口内容偏移以及中文输入的问题
    Python 中除法运算需要注意的几点
  • 原文地址:https://www.cnblogs.com/_error/p/9856796.html
Copyright © 2011-2022 走看看