JS判断数据类型的几种方法

文章详细介绍了JavaScript中的数据类型,包括基本数据类型(String,Number,Boolean,Null,Undefined,Symbol)和引用数据类型(Object,Array,Function)。讨论了typeof操作符用于判断基本数据类型,但对null和对象返回object的问题。instanceof用于检查实例与构造函数的关系,而constructor则能检测除undefined和null外的构造函数。最后提到了Object.prototype.toString.call方法可以揭示对象的内部[[Class]]属性,提供更全面的数据类型判断。

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

首先,我们回顾一下JavaScript中的数据类型总共分为两大类,基本数据类型和引用数据类型

  1. 基本数据类型:

String、Number、Boolean、Null、Undefined、Symbol(es6新增的)

  1. 引用数据类型:

Object、Array、Function

判断数据类型的方法:

  1. typeof:通常用来判断基本数据类型,它返回表示数据类型的字符串,注意,使用typeof来判断null引用数据类型返回结果都是'object'
typeof 1       //number
typeof 'a'     //string
typeof null    //object
typeof [1,2]   //object
function Fn(){}
typeof new Fn()  //object
  1. instanceof:如:A instanceof B 判断A是否为B的实例(即B的prototype属性所指向的对象是否在A的原型链上 A 的 _proto_ 指向 B 的 prototype,如果是返回true,否则返回false。instanceof只能用来判断两个对象是否属于实例关系,而不能判断一个对象实例具体属于哪种类型。
function B(name,age){
  this.name = name;
  this.age = age;
}
 
A = new B('张三',18);
console.log(A instanceof B)  //true

let obj = {}; //创建一个空对象obj
console.log(obj instanceof Object); // true

arr = new Array()  //创建一个空数组arr  或arr = []
console.log(arr instanceof Array ); // true

date = new Date()
console.log(date instanceof Date ); // true
// 注意:instanceof后面一定要是对象类型,instanceof前面相当于它的实例对象

但是这种方式判断有个弊端:对于number,string,boolean这三种基本数据类型,只有通过构造函数定义比如:let num =new Number(1);这样定义才能检测出。let num = 1; 这样定义是检测不出来的

  1. constructor:针对instanceof的弊端,我们使用constructor检测,constructor是原型对象的属性,指向构造函数
let num = 23;
let date = new Date();
let str = "biu~";
let reg = new RegExp();
let bool = true;
let fn = function () {
  console.log(886);
};
let udf = undefined;
let nul = null;
let array = [1, 2, 3];
console.log(num.constructor); // [Function: Number]
console.log(date.constructor); // [Function: Date]
console.log(str.constructor); // [Function: String]
console.log(bool.constructor); // [Function: Boolean]
console.log(fn.constructor); // [Function: Function]
console.log(reg.constructor); // [Function: RegExp]
console.log(array.constructor); // [Function: Array]

constructor解决了instanceof的弊端,可以检测出除了undefined和null之外的9种数据类型(因为它俩没有原生构造函数)

console.log(udf.constructor);//Cannot read property "constructor" of undefined
console.log(nul.constructor);//Cannot read property "constructor" of null
  1. Object下的toString.call():可以判断基本数据类型和引用数据类型
Object.prototype.toString.call();
console.log(toString.call(123));          //[object Number]
console.log(toString.call('123'));        //[object String]
console.log(toString.call(undefined));    //[object Undefined]
console.log(toString.call(true));         //[object Boolean]
console.log(toString.call({}));           //[object Object]
console.log(toString.call([]));           //[object Array]
console.log(toString.call(function(){})); //[object Function]

在《你不知道的javaScript》(中卷)中讲到:所有typeof返回值为"object"的对象,都包含一个内部属性[[Class]],我们可以把他看作一个内部的分类,而非传统意义上面向对象的类,这个属性无法直接访问,一般通过Object.prototype.toString(…)来查看。并且对于基本数据类类型null,undefined这样没有原生构造函数,内部的[[Class]]属性值仍然是Null和Undefined

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值