乐趣区

关于javascript:JavaScript判断数据类型

在 ES5 的时候,数据类型 有 6 种:Number、String、Boolean、undefined、object、Null。
ES6 中新增了一种 Symbol,示意举世无双的值。
JS 中该如何判断数据属于哪种数据类型呢?现整顿了四种判断办法,可用作前端面试筹备资料。

1、typeof

typeof 是一个操作符,右侧跟一个一元表达式,返回这个表达式的数据类型,以字符串的模式示意。

        console.log(typeof 1);//number
        console.log(typeof '1');//string
        console.log(typeof true);//boolean
        console.log(typeof undefined);//undefined
        console.log(typeof {});//object
        console.log(typeof null);//object
        console.log(typeof Symbol());//symbol
        console.log(typeof []);//object
        console.log(typeof new Date());//object
        console.log(typeof new RegExp());//object
        console.log(typeof new Error());//object
        console.log(typeof NaN);//number

【留神】
1、typeof 一个数组的时候会返回 object;
2、判断数据是否为数组能够应用 Array 原型上的.isArray()办法,返回一个布尔值,

         var a = [1,2,3];
         console.log(typeof a);  //object
         console.log(Array.isArray(a));  //true

3、typeof null 也会返回 object;
4、typeof new Date()、typeof new RegExp()、typeof new Error()都会返回 object;
5、typeof NaN 会返回 number,NaN 也是 Number 的一种。

2、instanceof

利用 instanceof 来判断 A 是否为 B 的实例,表白为 A instanceof B,返回一个布尔值。instanceof 的原理是通过检测对象的原型链上是否含有类型的原型。

        console.log({} instanceof Object);//true
        console.log([] instanceof Array);//true
        console.log([] instanceof Object);//true
        let fn = function (a, b) {return a + b}
        console.log(fn instanceof Function);//true

【留神】
面试中一个十分常见的手写代码题目就是手写 instanceof,判读的思路就是看左边变量的原型是否存在于右边变量的原型链上。代码如下:

        // 手写实现 instanceof
        function myinstanceof(left, right) {
            let leftValue = left.__proto__;
            let rightValue = right.prototype;
            while (true) {if (leftValue === null) {return false} else if (leftValue === rightValue) {return true} else {leftValue = leftValue.__proto__}
            }
        }

3、constructor

JS 规定,每个构造函数都会有一个 prototype 属性,即为构造函数的原型对象,而原型对象中会有一个 constructor 属性指回到构造函数。当利用构造函数创立新对象时,原型上的 constructor 属性也会被遗传到新创建的对象上,从原型链的角度讲,构造函数也代表了对象的类型。

        console.log(new Number(1).constructor == Number);//true
        console.log(new String(1).constructor == String);//true
        console.log(true.constructor == Boolean);//true
        console.log(new Object().constructor == Object);//true
        console.log(new Error().constructor == Error);//true

4、Object.prototype.toString.call()

toString()办法是 Object 原型上的办法,调用此办法,返回格局为 [object,xxx],xxx 即为判断的后果。对于 Object 对象能够间接调用 Object.prototype.toString(),对于其余数据类型,须要通过.call() 来调用。

        console.log(Object.prototype.toString({}));//[object Object]
        console.log(Object.prototype.toString.call(''));//[object String]
        console.log(Object.prototype.toString.call(1));//[object Number]
        console.log(Object.prototype.toString.call(true));//[object Boolean]
        console.log(Object.prototype.toString.call(undefined));//[object Undefined]
        console.log(Object.prototype.toString.call(null));//[object Null]
        console.log(Object.prototype.toString.call(Symbol()));//[object Symbol]
        console.log(Object.prototype.toString.call(new Error()));//[object Error]

【作者程度无限,欢送大家在评论区交换斧正~】

退出移动版