JS数据类型检测

209 阅读1分钟


1.typeof:用来检测数据类型运算符

语法:typeof[value]

返回值:

1.字符串

2.字符串中包含对应的数据类型,例如:"number"、"symbol"、"object"、"undefined"、"function"、"boolean".

局限性:

 typeof null =>"object" || typeof[] =>"object" || typeof{} =>"object"  ||  typeof/^$/ =>"object"

优势:使用方便,所以在真实项目中,我们也会大量应用它来检测,尤其是检测基本类型值(除null之外)和函数类型值的时候,他还是很方便。

局限性:

1.检测行参赋值默认值的是否为‘undefied’

function func (m,n){
   n === undefined ? n = 0 : null;
   typeof m === "undefied" ? m = 0 : null;
}

2.回调函数执行

function func (m,n,callback){
  typeof  callback === "function" ? callback() : null;
}
func (10, 20 function anonymous(){});

2.instanceof:本义用来检测实例是否隶属于某个类的运算符,我们基于这样的方式也可以用来作某些数据类型的检测,例如:数组、正则等

let arr = [],
    reg = /^$/;
console.log(arr instanceof Array); //true
console.log(reg instanceof Array); //false

局限性

1.不能处理基本数据类型

console.log(1 instanceof Number); //false
增加知识点
创建值的两种方式(两种方式都是类的实例):
1.字面量:let n =12;
2.构造函数 let m = new Number("12");

2.只要在当前实例的原型链(__prpto__)中出现过的类,检测结果都为true(用户可能会手动修改原型链的指向:example .__proto__,或者在类的继承中等情况)

let arr = [],
    obj = {},
    reg = /^$/;
console.log(arr instanceof Object); //true
console.log(obj instanceof Array); //false

function func () {
    console.log(arguments instance Array); //false
    
    arguments.__proto__ = Array.prototype;
    console.log(arguments instance Array); //true  
}
func();

3.constuctor

在类的原型上一般都会带有constructor,存储当前类本身,我们也是利用这一点,获取某的实例constructor属性值,验证是否为所属类,从而进行数据类型检测

let n = 12;
console.log(n.constructor === Number); //true
console.log(arr.constructor === Array); //true
console.log(arry.constructor === Object); //false
arr.constructor = 111;
console.log(arr.constructor === Array); // false

4.Object.prototype.toString.call([value]):

原理

在所有的数据类型类中,他们的原型上都有toString方法,除object.toString不是把数据类型转换为字符串,其余都是转为字符串,而object原型上的toString是检测当前实例隶属类的详细信息(检测数据类型)//object.toString:

1.首先基于原型链查找机制,找到object.prototype.toString

2.把找到的方法执行,方法中的this -> obj

3.方法内部把this(obj)的所属信息输出

=> 方法执行,方法中的this是谁,就是检测睡的所属信息

返回值

"[Object Number]"

String/Boolean/Null/Undefined/Symbol/Object/Array/RegExp/Date/Math.......

let obj1 = {},
    obj2={
        name:"wade"
    };
console.log(obj1.toString()); //“[Object object]”
console.log(obj2.toString()); //“[Object object]”

//
let _obj = {};
console.log(_object.toString.call(100)); //"[Object Number]"
console.log(Object.prototype.toString.call(100)); //"[Object Number]"

希望这个js重写的检测方法能帮你更好的理解数据检测

var _obj = {
        isNumeric: "Number",
        isBoolean: 'Boolean',
        isString: 'String',
        isNull: 'Null',
        isUndefined: 'Undefined',
        isSymbol: 'Symbol',
        isPlainObject: 'Object',
        isArray: 'Array',
        isRegExp: 'RegExp',
        isDate: 'Date',
        isFunction: "Function",
        isWindow: 'Window'
    },
    _toString = _obj.toString, //基于toString换要检测的数据
    _type = {};
for (var key in _obj) {
    if (!_obj.hasOwnProperty(key)) break;
    _type[key] = (function() {
        var reg = new RegExp("^\\[object " + _obj[key] + "\\]$");
        return function anonymous(val) {
            return reg.test(_toString.call(val));
        }
    })();
};