javascript数据类型判定不失手的方法及各种方法实践

es6后的js有7种数据类型,分基本类型和引用类型两大类,分别是:

基本类型:String、Number、Boolean、Symbol、Undefined、Null;

引用类型:Object;

基本类型值指的是 简单的数据段。也称为简单类型,由于其占据空间固定,是简单的数据段,为了便于提升变量查询速度,存储于栈内存中。

引用类型值指那些可能由多个值构成的对象。也称为复杂类型,由于其值的大小会改变,所以不能将其存放在栈中,否则会降低变量查询速度,因此,其值存储在堆(heap)中,而存储在变量处的值,是一个指针(或者说是一个对象的地址),指向存储对象的内存处,即按地址访问。对象的类型除了Object外,还包括Function、Array、RegExp、Date、Error、Math等,但它们都是js的内置对象,原型链的底层都是Object。引用类型作为传参使用时,传输的只是其指针的副本。

如果要分辨它们,有不少常用的方法,先拿一个稳妥的展示一下:

1、Object.prototype.toString.call,目前未失手

toString()是Object的原型方法,调用该方法,默认返回当前对象的[[Class]],其格式为[object Xxx],其中Xxx就是对象的类型。对于普通的Object对象及部分内置对象,直接调用toString()就能返回[object Object]。对于其它的对象或者类型,则需通过call/apply调用才行。

// 六种基本类型

Object.prototype.toString.call(''") ; // [object String]

Object.prototype.toString.call(0) ; // [object Number]

Object.prototype.toString.call(false) ; // [object Boolean]

Object.prototype.toString.call(undefined) ; // [object Undefined]

Object.prototype.toString.call(null) ; // [object Null]

Object.prototype.toString.call(Symbol()); //[object Symbol]

 

// 一种引用类型

Object.prototype.toString.call(new Object()) ; // [object Object]

 

// 其它引用类型

Object.prototype.toString.call(new Function()) ; // [object Function]

Object.prototype.toString.call(new Date()) ; // [object Date]

Object.prototype.toString.call([]) ; // [object Array]

Object.prototype.toString.call(new RegExp()) ; // [object RegExp]

Object.prototype.toString.call(Math) ; // [object Math]

Object.prototype.toString.call(new Error()) ; // [object Error]

Object.prototype.toString.call(document) ; // [object HTMLDocument]

Object.prototype.toString.call(window) ; // [object Window] window 是全局对象 global 的引用

 

2、typeof,除了null以外,其余的技术上都正确,不过有时我们不想要这个答案

typeof是一个操作符,其右侧跟一个一元表达式,并返回这个表达式的数据类型。返回的结果用该类型的字符串(小写)表示,包括以下七种:string、number、boolean、symbol、undefined、object、function;绝大部分情况下,它是对的,因为这些类型实质上都是object,但确实不是我们想要的,比方说:

typeof []; //object 不是想要的array

typeof new Date(); //object 不是想要的date

typeof new RegExp(); //object 不是想要的regexp

typeof new Error(); //object 不是想要的error

typeof Math; //object 不是想要的math

typeof new Boolean(); //object 不是想要的boolean

不过关于null,它判断错误:

typeof null; //object 不是想要的null

它判断对且是我们需要的有六种基本类型中的五种:string、number、boolean、symbol、undefined,以及function:

typeof ''; // string 有效

typeof 1; // number 有效

typeof false; // boolean 有效

typeof Symbol(); // symbol 有效

typeof true; // boolean 有效

typeof undefined; // undefined 有效

typeof null; // object 不是想要的null

typeof new Function(); // function 有效

如果使用new Boolean()、new Number()、new String(),会生成js内置对象,typeof会判定为object。

3、instanceof、constructor,通过原型和构造函数来判断:

instanceof 可判断A是否是B的实例。例如:A instanceof B,若A是B的实例,则返回true,否则返回false。

var b={};

b instanceof Object;// true

[] instanceof Array; // true

new Date() instanceof Date;// true

new Function() instanceof Function;// true

new RegExp() instanceof RegExp;// true

Math instanceof Object;// true无从判断

new Error() instanceof Error; //true

 

[] instanceof Object; // true

new Date() instanceof Object;//true

...

对于对象而言,原型链的底层都是Object,因此不能判断一个对象实例具体属于哪个类型。即使使用switch挨个匹配,也有Math对象过不了关。使用instanceof在Math上折戟沉沙。

constructor(构造函数):保存着用于创建当前对象的函数。不过函数对象的constructor是不稳定的,重写prototype后,原有的constructor引用会丢失,默认为Object;

//基础类型中,null、undefined报错,需使用其它方法判定

"".constructor.name; //String

var k=1; k.constructor.name; //Number

false.constructor.name; //Boolean

Symbol().constructor.name; //Symbol

//引用类型,绝大部分内置对象没有问题,但Math无从判断

new Object().constructor.name; //Object

function a(){};a.constructor.name; //Function

new RegExp().constructor.name; //RegExp

new Error().constructor.name; //Error

new Date().constructor.name; //Date

document.constructor.name; //HTMLDocument

window.constructor.name; //Window

Math.constructor.name; //Object 无法判别

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值