JS 类型判断

491 阅读2分钟

在开发中,需要经常去判断数据类型,下面就总结下js中常用的判断类型方法

    var a, 
        b = null,
        c = 'aa',
        d = 1,
        e = {
            name: 'ee',
            id: 1
        },
        f = function () {
            var yy = '函数';
            console.log(yy);
        },
        g = false,
        h = true,
        i = ['1', '2', '3'];

typeof:

  • 共有 7 种返回值, 返回的值都是 字符串 类型。

    1. undefined
    console.log(typeof(a)); // undefined 未赋值
    console.log(typeof(z)); // undefined 未定义
    
    1. string
    console.log(typeof(c)); // string
    
    1. number
    console.log(typeof(d)); // number
    console.log(typeof(NaN)); // number
    
    1. boolean
    console.log(typeof(g)); // boolean
    console.log(typeof(h)); // boolean
    
    1. function
    console.log(typeof(f)); // function
    
    1. object

      typeof() 对数组、null都返回 object,所以在检测 数组、null 数据类型时不能使用 typeof ()方法。

    console.log(typeof(e)); // object
    console.log(typeof(i)); // object  是个数组
    console.log(typeof(b)); // object  null
    
    1. symbol

    这个类型很少用,

    console.log(typeof Symbal('aa')); // symbol
    

instanceof

  • instanceof 运算符用来判断一个构造函数的prototype属性所指向的对象是否存在另外一个要检测对象的原型链上。
obj instanceof Object // 实例 obj 在不在 Object 构造函数中。
console.log(e instanceof Object); // true
console.log(e instanceof Function); // false
console.log(f instanceof Object); // true
console.log(f instanceof Function); // true
console.log(Object instanceof Function); // true;
console.log(Function instanceof Object); // true
console.log(i instanceof Object); // true
console.log(i instanceof Function); // false

Object.prototype.toString.call()

  • 这个检测方法可以检测到所有类型
console.log(Object.prototype.toString.call(a)); // [object Undefined]
console.log(Object.prototype.toString.call(b)); // [object Null]
console.log(Object.prototype.toString.call(c)); // [object String]
console.log(Object.prototype.toString.call(d)); // [object Number]
console.log(Object.prototype.toString.call(e)); // [object Object]
console.log(Object.prototype.toString.call(f)); // [object Function]
console.log(Object.prototype.toString.call(i)); // [object Array]
console.log(Object.prototype.toString.call(g)); // [object Boolean]

介绍几种判断一个对象是否是数组的方法

  • Array.isArray(obj); 无法判断是否是空数组。
Array.isAray([]); // true 
Array.isAray({}); // false
  • array instance Array 无法判断是否是空数组。
console.log([] instanceof Array); // true
  • Object.prototype.toString.call(array)
console.log(Object.prototype.toString.call([]) === "[object Array]"); // true
  • array.constructor
console.log([].constructor === Array); // true

看一下如何判断一个Object

  • obj instanceof Object
console.log( {} instanceof Object); // true

但是这个方法有局限性。

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

因为数组也是对象,所以也会返回 true。

  • Object.prototype.toString.call(obj)
console.log(Object.prototype.toString.call({}) === "[object Object]");

这个方法是最好的。

  • obj.constructor
console.log({}.constructor === Object); // true;

这个方法也不错。

总结一下:在实际工作中,我们经常使用 (!!someData) 来判断某个字段是否存在。具体的数据类型判断可以使用上面介绍的方法。简单数据类型可以使用 typeof 来进行判断。