欢迎光临
我们一直在努力

JavaScript | 变量类型检测typeof + Object.prototype.toStirng.call()

注意:Object.prototype.toString.call()可以识别标准类型及内置对象类型,但不能识别自定义类型

function getVarType(val){
    //先用typeof 检测,如果是object今日第二轮检测
    var type = typeof val;
    if(type === 'object'){
        //调用Object原型上的toString方法,返回类似[object Object]的字符串,切割获取数据类型
        var typeStr = Object.prototype.toString.call(val);
        typeStr = typeStr.split(' ')[1];
        type = typeStr.substring(0,typeStr.length - 1);
    }
    return type;
}

console.log(getVarType('1'));  //string
console.log(getVarType(1));    //number
console.log(getVarType(function(){})); //function
console.log(getVarType(true));  //boolen
console.log(getVarType(undefined)); //undefined

console.log(getVarType(null));  //Null
console.log(getVarType([1,2])); //Array
console.log(getVarType({1:1,2:2})); //Object
console.log(getVarType(new Date())); //Date

typeof()

typeof运算符用于判断对象的类型,但是对于一些创建的对象,它们都会返回object

instanceof()

ECMAScript 引入了另一个 Java 运算符 instanceof 来解决这个问题。instanceof 运算符与typeof 运算符相似,用于识别正在处理的对象的类型。instanceof运算符用来判断一个构造函数的prototype属性所指向的对象是否存在另外一个要检测对象的原型链上。与 typeof 方法不同的是,instanceof方法要求开发者明确地确认对象为某特定类型。

Object.prototype.toString.call()

首先,取得对象的一个内部属性[[Class]],然后依据这个属性,返回一个类似于”[object Array]“的字符串作为结果(看过ECMA标准的应该都知道,[[]]用来表示语言内部用到的、外部不可直接访问的属性,称为“内部属性”)。利用这个方法,再配合call,我们可以取得任何对象的内部属性[[Class]],然后把类型检测转化为字符串比较,以达到我们的目的。

instanceof + typeof

通过instanceof和typeof也可以实现数据类型检测,但是由于对象类型太多,需要把每个都列出来,比较繁琐(下面的代码并未列全),要注意Object必须放在最后进行判断,否则前面的所有复杂类型都将返回object

function getType(item){
    var type = typeof item;
    if(type!=='object') return type;
    if(item === null) return null;
    if(item instanceof RegExp){
        return 'regexp';
    }
    if(item instanceof Function){
        return 'function';
    }
    if(item instanceof Set){
        return 'set';
    }
    if(item instanceof Map){
        return 'map';
    }
    if(item instanceof Symbol){
        return 'symbol';
    }
    if(item instanceof Date){
        return 'date';
    }
    if(item instanceof Array){
        return 'array';
    }
    if(item instanceof Object){  //这个必须放在最后!!
        return 'object';
    }
}

补充:instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。

赞(1) 打赏
未经允许不得转载:散人研 » JavaScript | 变量类型检测typeof + Object.prototype.toStirng.call()
分享到: 更多 (0)

评论 抢沙发

7 + 8 =
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏