前端JS必备知识点:判断数据类型

本文详细介绍了JavaScript中四种数据类型判断方法:typeof、instanceof、Object.prototype.toString.call()和constructor,对比了它们在处理简单和复杂数据类型时的优劣。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

判断数据类型

在JS中有这几种方法来判断数据类型:typeof、instanceof、Object.prototype.toString.call()、constructor

1、typeof

typeof 对于简单数据类型(undefined、null、boolean、number 、string )可以判断的出来,但是对于复杂数据类型就不起作用(Array),因为对于复杂数据类型的判断结果也是object,跟null的判断返回结果相同,因此这个时候判断不出来是复杂数据类型还是null简单数据类型,返回值为该值的数据类型(undefined、null(object)、boolean、number 、string )

var o = new Array();
console.log(typeof 1);//number
console.log(typeof 'xiaoming');//string
console.log(typeof true);//boolean
console.log(typeof undefined);//undefined
console.log(typeof null);//object
console.log(typeof o);//object

2、instanceof

instanceof可以判断对象是不是另一个对象实例,主要作用是来判断复杂数据类型的,返回值为布尔值;

console.log([] instanceof Array);//true
console.log({} instanceof Object);//true
console.log(function(){} instanceof Function);//true

instanceof也可以判断简单数据类型,但是简单数据类型不能以字面量的形式创建,否则返回值为false;如果通过new关键字去创建简单数据类型,则返回值为true;null和undefined这两个比较特殊,浏览器对这两个不是很友好。

console.log(1 instanceof Number);//false
console.log('xiaoming' instanceof String);//false
console.log(true instanceof Boolean);//false
console.log('--------------------------------');
console.log(new Number(1) instanceof Number);//true
console.log(new String('xiaoming') instanceof String);//true
console.log(new Boolean(true) instanceof Boolean);//true

当简单数据类型(字符串)通过Object构造函数创建变量时,自动创建String实例,赋值给变量后销毁,相当于通过new关键字去创建简单数据类型;

var str=new Object('hello world');
console.log(str instanceof String);//true
console.log(str instanceof Object);//true

3、Object.prototype.toString.call()

Object.prototype.toString.call()能够准确的判断所有的数据类型;

var a = Object.prototype.toString;
console.log(a.call("xiaoming"));//String
console.log(a.call(1));//Number
console.log(a.call(true));//Boolean
console.log(a.call(null));//Null
console.log(a.call(undefined));//Undefined
console.log(a.call([]));//Array
console.log(a.call(function () { }));//Function
console.log(a.call({}));//Object

4、constructor

constructor也能够判断多种数据类型,这里跟instanceof一样,null和undefined除外;

console.log(("xiaoming").constructor === String);//true
console.log((1).constructor === Number);//true
console.log((true).constructor === Boolean);//true
//console.log((null).constructor === Null);
//console.log((undefined).constructor === Undefined);
console.log(([]).constructor === Array);//true
console.log((function () { }).constructor === Function);//true
console.log(({}).constructor === Object);//true

但是有时候constructor也会出现问题,声明了一个构造函数,并且把他的原型指向了Array的原型,这个时候constructor就无能为力了:

function Fun() { };
Fun.prototype = new Array();
//Fun.prototype.constructor = Fun;应该把Fun构造函数的constructor重新指回Fun
var f = new Fun();
console.log(f.constructor === Fun);//false
console.log(f.constructor === Array);//true
console.log(f.__proto__);//[] 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

湖大啊哈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值