美文网首页JavaScriptWeb前端之路让前端飞
JavaScript检验数据类型的方法

JavaScript检验数据类型的方法

作者: 椰果粒 | 来源:发表于2017-05-17 21:13 被阅读47次
    1. typeof操作符

    typeof 返回的都是字符串,它是一个操作符,而不是函数,所以typeof()和typeof都可以。用typeof来确定是一个字符串,数值,布尔值,还是undefined。而如果用来检测null和对象的话,都会返回object。
      使用typeof可能返回几种字符串

    "undefined"——值未定义
    "boolean"——值是布尔值
    "string"——值是字符串
    "number"——值是数值
    "object"——值是对象或者null
    "function"——值是函数
    

    操作符的操作数可以是变量或者字面量
    看下面的栗子

    var a;
    var b = true;
    var c = 'hello';
    var d = 123;
    var e = {}
    function f(){
        alert("");
    }
    
    console.log(typeof a);  // undefined
    console.log(typeof b);  // boolean
    console.log(typeof c);  // string
    console.log(typeof d);  // number
    console.log(typeof e);  // object
    console.log(typeof f);  // function,函数在ECMAScript中也是对象,而不是一种数据类型。而函数有一些特殊的属性。所以要用typeof来区分函数和对象(一个返回function,一个返回object)
    console.log(typeof null);// object,因为null被认为是一个空对象引用
    
    2. instanceof操作符用来检验引用类型

    instanceof只能用来判断对象和函数,不能用来判断基本类型,因为基本类型不是对象,所以instanceof判断基本类型会返回false

    var a = new Array();
    var b = {};
    console.log(a instanceof Array);    // true
    console.log(b instanceof Object);   // true
    
    console.log(new Date() instanceof Date);// true
    console.log(123 instanceof Number); // false
    

    是否存在于原型链上

    function Person(){}
    var p = new Person();
    console.log(p instanceof Person);   // true
    

    实例是否属于他的父类

    function Person(){}
    function Student(){}
    var p = new Person();
    Student.prototype = p;  // 继承原型
    var s = new Student();
    console.log(s instanceof Person);   // true
    console.log(s instanceof Student);  // true
    

    基本类型不是对象,所以instanceof返回false

    var a = '123';
    console.log(a instanceof String);   // false
    console.log(typeof a);  // string
    var b = new String('123');
    console.log(b instanceof String);   // true
    console.log(typeof b);  // object
    

    因为所有引用类型都是Object的实例,所以任何引用类型值和Object构造函数都返回true

    console.log([] instanceof Array);   // true
    console.log([] instanceof Object);  // true
    

    判断数组方法:constructor是系统默认加上的

    var arr = [1,2,3];
    console.log(arr.constructor === Array); // true
    // instanceof 是检测对象的原型链是否指向构造函数的prototype对象
    
    3. Object.prototype.toString.call(value)精确判断对象的数据类型
    1. 在任何值上调用Object原生的toString()方法,都会返回一个[object NativeConstructorName]格式的字符串。每个类在内部都有一个class属性,这个属性中就指定了上述字符串的构造函数名。
    1. 由于原生数组的构造函数名与全局作用域无关,因此使用toString()方法就能保证返回一样的值。这就解决了上述instanceof操作符的不足。而其他类型的值也一样能正确返回

      var a = 1;
      console.log(Object.prototype.toString.call(a)); // [object Number]

      var b = undefined;
      console.log(Object.prototype.toString.call(b)); // [object Undefined]

      console.log(Object.prototype.toString.call(null)); // [object Null]
      console.log(Object.prototype.toString.call(true)); // [object Boolean]

      var c = [1,2];
      console.log(Object.prototype.toString.call(c)); // [object Array]

      这一技巧也广泛应用于检测原生Json对象
      var isNativeJSON = window.JSON && Object.prototype.toString.call(JSON) == '[object JSON]'

    这里解释一点 : 为什么返回的都是对象形式
    原因是call(value)在绑定作用域时,传入的value如果不是Objrct而是原始值,比如字符串,布尔值等,这个原始值会被转化成它的对象形式。
    具体参见,你不知道的JavaScript上卷88页。

    object的toString()方法不能检测非原生构造函数的构造函数名·,所以开发人员自定义的任何构造函数都将返回[object Object]。所以在web开发中能区分原生和非原生的JavaScript对象是非常重要的,只有这样才能知道某个对象到底有哪些功能。
    不过Object.prototype.toString()本身也可能被修改,我们假定的是Object.prototype.toString()未被修改的情况

    相关文章

      网友评论

        本文标题:JavaScript检验数据类型的方法

        本文链接:https://www.haomeiwen.com/subject/nxylxxtx.html