js类型识别的4种方式

作者: 故笙丶 | 来源:发表于2017-04-09 10:20 被阅读48次

首先我们来了解一下js中的数据类型包含哪些。

一、js数据类型

1.Number(数字型)
2.String(字符串行)
3.Boolean(布尔型)
4.Object (引用类型/对象类型)
5.Null(空值)
6.Undefined(未定义值)

除Object为对象(引用)类型之外,其他都是原始(值)类型。

javascript是以Object为基础的语言,除基本数据类型外,其他所有的引用数据类型,本质上都是Object。

二、类型识别的几种方式

1.typeof

typeof是一个一元运算,放在一个运算数之前,运算数可以是任意类型。
它返回值是一个字符串,该字符串说明运算数的类型。typeof一般只能返回如下几个结果:
number,boolean,string,function,object,undefined

console.log(typeof 'abc');  //string
console.log(typeof 1 );  //number
console.log(typeof true );  //boolean
console.log(typeof undefined );  //undefined
console.log(typeof null );  //object
console.log(typeof {name: 'moon'} );  //object
console.log(typeof function () {} );  //function
console.log(typeof [] );  //object
console.log(typeof new Date() );  //object
console.log(typeof /\d/ );  //object
function Person() {}
console.log(typeof new Person() );  //object

小结:

  • typeof可以识别原始类型(Null除外),Null类型会被识别成object
  • 不能识别具体的对象类型(Function除外)

2.instanceof

instanceof 用于判断一个变量是否某个对象的实例(一个实例是否属于某一类型),用来识别对象类型。

或者说,对象与构造函数在原型链上是否有关系。

//能够判别内置对象
var a=new Array();
console.log(a instanceof Array); //true
console.log(a instanceof Object);//true.(因为Array是object的子类)
//能够判别自定义对象类型
function test(){};
var a=new test();
console.log(a instanceof test); //true
//不能判别原始数据类型
console.log(1 instanceof Number); //false
console.log('moon' instanceof String); //false

小结:

  • 可以判别所有对象类型,包括内置对象和自定义对象
  • 不能判别原始类型

3.Constructor

查看对象的构造函数

//判别原始类型
console.log('moon'.constructor === String); //true
console.log((1).constructor === Number);  //true,注意这里1要加上括号
console.log(true.constructor === Boolean); //true
//判别内置对象
console.log([].constructor === Array );  //true
//判别自定义对象
function Aaa(){
}
var a1 = new Aaa();
console.log( a1.constructor );  //Aaa

小结:

  • 判别原始类型(Undefined和Null除外,因为它们没有构造函数)
  • 判别内置对象类型
  • 判别自定义对象类型

获取对象构造函数名称的方法:

function getConstructorName(obj){
    return (obj===undefined||obj===null)?
            obj:
           (obj.constructor&&obj.constructor.toString().match(/function\s*([^(]*)/)[1]);
}

说明:

1.入参obj如果是undefined和null,则返回其自身;
2.入参obj如果是其他值,则返回obj.constructor&&obj.constructor.toString().match(/function\s([^(])/)[1]的结果;
1)obj.constructor //保证这个对象存在构造函数,保证&&后面的语句正常执行。
2)obj.constructor.toString(); //”function Number(){[native code]}”,构造函数的名称,这里假设为Number()对象。
3).match(/function\s([^(])/)[1]; //”Number” ,通过.match方法获取字符串中的子字符串

4.Object.prototype.toString.call()或{}.prototype.toString.call()

在使用时Object.prototype.toString.call(xxx)会返回类似[object String]的字符串给我们,用它就可以很好的判断类型了。

//先把方法封装成一个函数
function type(obj) {
    return Object.prototype.toString.call(obj).slice(8,-1);
}
//字符串截取我们需要的部分
console.log(type('moon')); //String
console.log(type(1)); //Number
console.log(type(true)); //Boolean
console.log(type(undefined)); //Undefined
console.log(type(null));  //Null
console.log(type({})); //Object
console.log(type([])); //Array
console.log(type(new Date())); //Date
console.log(type(/\d/));  //RegExp
console.log(type(function () {})); //Function
function Person() {
}
console.log(type(new Person())); //Object

小结:

  • 可以识别所有原始类型和内置对象类型
  • 不能识别自定义对象类型

5.总结

没有完美的判断类型的方法,但是我们可以根据需求自行选取合适的。

最后来一个练习题吧~
函数myType用于根据输入参数返回相应的类型信息。
语法如下:

var str = myType (param);

使用范例如下:

myType (1);     返回值: "number"
myType (false);     返回值: "boolean"
myType ({});        返回值: "object"
myType ([]);        返回值:" Array"
myType (function(){});  返回值:"function"
myType (new Date());    返回值: "Date"

请写出函数myType的实现代码。

function myType(param){
    if(typeof param=="object"){
        return Object.prototype.toString.call(param).slice(8,-1)=="Object"?
              "object":
               Object.prototype.toString.call(param).slice(8,-1);
   }else{
       return typeof param;
    }
}

相关文章

  • js类型识别的4种方式

    首先我们来了解一下js中的数据类型包含哪些。 一、js数据类型 1.Number(数字型)2.String(字符串...

  • js入门知识点

    * 基础知识 * js的输出方式 * js的组成 * js的命名规范 * 数据类型 * number数据类型 * ...

  • JS深浅拷贝

    JS存储方式 JS中存在基本数据类型和引用数据类型1.基本数据类型:number,string,boolean,n...

  • js 高级函数

    1:基本类型和引用类型? 2:基本类型和引用类型的区别? 3:js的内存方式? 4:浏览器解析js代码的时候的顺序...

  • JS基础知识 (一)--变量类型和计算

    变量类型 js变量类型分为基本类型(或者叫值类型)和引用类型。(按照存储方式区分)• 值类型值类型:Number、...

  • js基础面试题

    面试题:延迟加载JS有哪些方式? 面试题:JS数据类型有哪些? 面试题:JS数据类型考题 考题一: 考题二: 面试...

  • JavaScript-总结篇之变量类型

    JS中使用typeof能得到哪些类型? 何时使用===何时使用==? JS中有哪些内置函数? JS变量按照存储方式...

  • JS数据类型判断

    JS中判断数据类型的方式(已知8种) 2021了,这些判断方式你都知道吗 typeof 常见的判断类型的方式,但是...

  • js的类型检测方式

    1.typeof 2.instanceof 3.constructor 4.Object.prototype.to...

  • Day06 JavaScript

    1. JS 输出方式 2.JS变量声明 3.JS声明提前 4.JS基本数据类型 5.JS数组 6.JS对象 7.J...

网友评论

    本文标题:js类型识别的4种方式

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