js常用数据类型的判断

数据类型
基本类型:String、Number、Boolean、Undefined、Null 。由于其占据空间固定,是简单的数据段,为了便于提升变量查询速度,将其存储在栈中,即按值访问。
引用类型:Object。由于其值的大小会改变,所以不能将其存放在栈中,否则会降低变量查询速度,因此,其值存储在堆ject。由于其值的大小会改变,所以不能将其存放在栈中,否则会降低变量查询速度,因此,其值存储在堆(heap)中,而存储在变量处的值,是一个指针,指向存储对象的内存处,即按址访问。引用类型除 Object 外,还包括 Function 、Array、RegExp、Date 等等。

1. typeof

typeof("haha")  // "string"
typeof(222) // "number"
typeof(NaN) // "number"
typeof(true) // "boolean"
typeof(false) // "boolean"
typeof(null) // "object"
typeof(undefined) // "undefined"


typeof({}) // "object"
typeof([]) // "object"
typeof(function(){}) // "function"
typeof(()=>{}) //"function"
typeof(/2/) //"object"
typeof(new RegExp()) //"object"
typeof(new Date()) //"object"

无法识别出object、null、array、正则、日期等,
可以用于判断一个变量是否为函数,是的话,执行此函数,避免执行非函数导致程序报错。


2、instanceof
用来判断A是否为B的实例,语句:A instanceof B  如果 A 是 B 的实例,则返回 true,否则返回 false。

[] instanceof Array; //true
{} instanceof Object;//true
new Date() instanceof Date;//true

function Person(){};
new Person() instanceof Person;

[] instanceof Object; //true
new Date() instanceof Object;//true

需要注意的是instanceof是基于原型链的判断;
[].__proto__ === Array.prototype;
Array.prototype.__proto__ == Object.prototype;
所以[] instanceof Object为true
Date与正则同理。
综上所述:instanceof常用于判断变量是否为某个数据类型,例如判断某个变量(a)是否为数组  a  instanceof Array即可;

另外instanceof 不能用于基本数据类型的判断


3、constructor
{}.constructor === Object  //true
[].constructor === Array   //true
new Function().constructor === Function  //true
''.constructor === String   //true
var a = 2; a.constructor === Number  // true(2.constructor直接这么写浏览器会报变量错误)
true.constructor === Boolean //true
false.constructor ===Boolean //true
null.constructor  // Cannot read property 'constructor' of null
undefined.constructor // Cannot read property 'constructor' of undefined
其实[],{},'',2,false,true 均无constructor属性 都在各自的 __proto__中
根据上述打印结果:constructor 不可用于判断 null,undefined,且会报错

4.toString
Object.prototype.toString.call('') ;   // [object String]
Object.prototype.toString.call(1) ;    // [object Number]
Object.prototype.toString.call(true) ; // [object Boolean]
Object.prototype.toString.call(undefined) ; // [object Undefined]
Object.prototype.toString.call(null) ; // [object Null]
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(new Error()) ; // [object Error]
Object.prototype.toString.call(document) ; // [object HTMLDocument]
Object.prototype.toString.call(window) ; //[object global] window是全局对象 global 的引用

此方法可以判断所有的数据类型,但是必须通过 call 或 apply 来调用,不能直接用,而不能直接调用 toString ,
 虽然,从原型链的角度讲,所有对象的原型链最终都指向了 Object,
 按照JS变量查找规则,其他对象应该也可以直接访问到 Object 的 toString方法,但是事实上,大部分的对象都实现了自身的 toString 方法,
 这样就可能会导致 Object 的 toString 被终止查找,因此要用 call/apply 来强制调用Object 的 toString 方法。
 例如:
Object.prototype.toString  === {}.toString  //true
Object.prototype.toString  === [].toString //false


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值