JavaScript 中的所有数据类型 & 判断数据类型的方法

一、JS 中的数据类型

基本数据类型(也称为原始类型): Undefined(未定义)、Null(空值)、Boolean(布尔值)、Number(数字)、String(字符串) 和 Symbol(符号)。其中Symbol(符号)是ECMAScript 6(简称ES6) 新增的。

引用数据类型 : Object(对象)、Array(数组)、Function(函数)、Date(日期)、RegExp(正则表达式)、Map和Set(键值对组合)

基本数据类型描述引用数据类型描述
undefined表示值未定义Object一种复杂的数据类型,用于存储键值对。
boolean表示值为布尔值Array一种特殊的对象,用于存储有序的数据集合。
string表示值为字符串Function一种可执行的代码块,可以接受参数并返回值。
number表示值为数值Date用于处理日期和时间, 提供了一系列方法来供调用
function表示值为函数RegExp正则表达式! 用于匹配文本中的模式
symbol表示值为符号Map键值对的集合,提供更强大的数据存储和操作能力
Set一组唯一值的集合

1、基本数据类型(Primitive Data Types)

  1. Number:用于表示数字,可以是整数或浮点数。例如:let num = 42; let pi = 3.14;
  2. String:表示文本数据,用单引号或双引号括起来。例如:let str = 'Hello, world!';
  3. Boolean:只有两个值,true和false,用于表示逻辑状态。例如:let isTrue = true;
  4. Null:表示一个空值,通常用于初始化变量或表示对象不存在。例如:let emptyValue = null;
  5. Undefined:表示一个未初始化的变量或者没有返回值的函数的结果。例如:let notAssigned;,此时这个变量的值就是undefined
  6. Symbol(ES6 引入):一种唯一的、不可变的数据类型,通常用于作为对象属性的标识符。例如:let sym = Symbol('description');

2、引用数据类型(Reference Data Types)

  1. Object:可以存储多个键值对,键可以是字符串或 Symbol,值可以是任何数据类型。例如:let obj = { key: 'value' };。
  2. Array:用于存储一组有序的数据,可以包含不同类型的数据。例如:let arr = [1, 'two', true];
  3. Function:在 JavaScript 中,函数也是一种对象,可以作为变量传递、作为参数传递给其他函数或从函数中返回。例如:function add(a, b) { return a + b; }
  4. Date:用于处理日期和时间。例如:let now = new Date();
  5. RegExp:正则表达式对象,用于匹配文本中的模式。例如:let regex = /\d+/;
  6. Map(ES6 引入):键值对的集合,其中键和值可以是任何类型。例如:let myMap = new Map(); myMap.set('key', 'value');
  7. Set(ES6 引入):一组唯一值的集合。例如:let mySet = new Set(); mySet.add(1);

二、JS 中判断数据类型的方法

1.typeof

其中typeof返回的类型都是 字符串 形式,需注意!!!

  • 只能识别基础类型和引用类型 注意:nullNaNdocument.all 的判断
alert(typeof "helloworld")    ------------------>"string"     
alert(typeof 123)             ------------------>"number"
alert(typeof [1,2,3])         ------------------>"object"
alert(typeof new Function())  ------------------>"function"
alert(typeof new Date())      ------------------>"object"
alert(typeof new RegExp())    ------------------>"object"
alert(typeof Symbol())        ------------------>"symbol"
alert(typeof true)            ------------------>"true"
alert(typeof null)            ------------------>"object"
alert(typeof undefined)       ------------------>"undefined"
alert(typeof 'undefined')     ------------------>"string"

2.instance of

注意:instanceof 后面一定要是对象类型,并且大小写不能错,该方法适合一些条件选择或分支。

[1,2,3] instanceof Array                -------->true
new Date() instanceof Date              -------->true
new Function() instanceof Function      -------->true
new Function() instanceof function      -------->false
null instanceof Object                  -------->false

3.对象原型链判断方法: Object.prototype.toString.call() 最好用!!! 没有之一

适用于所有类型的判断检测,注意区分大小写. toString方法,在Object原型上返回数据格式

 console.log(Object.prototype.toString.call("123"))           -------->[object String]
 console.log(Object.prototype.toString.call(123))             -------->[object Number]
 console.log(Object.prototype.toString.call(true))            -------->[object Boolean]
 console.log(Object.prototype.toString.call([1, 2, 3]))       -------->[object Array]
 console.log(Object.prototype.toString.call(null))            -------->[object Null]
 console.log(Object.prototype.toString.call(undefined))       -------->[object Undefined]
 console.log(Object.prototype.toString.call({name: 'Hello'})) -------->[object Object]
 console.log(Object.prototype.toString.call(function () {}))  -------->[object Function]
 console.log(Object.prototype.toString.call(new Date()))      -------->[object Date]
 console.log(Object.prototype.toString.call(/\d/))            -------->[object RegExp]
 console.log(Object.prototype.toString.call(Symbol()))        -------->[object Symbol]
 console.log(Object.prototype.toString.call(new Set()))       -------->[object Set]
 console.log(Object.prototype.toString.call(new Map()))       -------->[object Map]

4.根据对象的constructor进行判断

constructor判断方法跟instanceof相似,但是constructor检测Object与instanceof不一样,constructor还可以处理基本数据类型的检测,不仅仅是对象类型

  • 语法:obj instanceof Type
  • 功能:判断 obj 是不是 Type 类的实例,只可用来判断引用数据
  • 实现思路: Type 的原型对象是否是 obj 的原型链上的某个对象
  • 注意:右操作数必须是函数或者 class
   //注意当出现继承的时候,使用constructor会出现问题
    function A() {};
    function B() {};
    A.prototype = new B(); //A继承自B
    console.log(A.constructor === B)  -------->false
    var C = new A();
    //现在开始判断C是否跟A的构造器一样
    console.log(C.constructor === B)  -------->true
    console.log(C.constructor === A)  -------->false 
    //解决这种情况,通常是手动调整对象的constructor指向
    C.constructor = A; //将自己的类赋值给对象的constructor属性
    console.log(C.constructor === A);  -------->true
    console.log(C.constructor === B);  -------->false

5.有局限的判断:严格运算符===

通常===出现在我们的条件判断中,比如判断一个变量是否为空,变量是否为数据等,示例如下

var a = null;
typeof a //object
a === null  //true
 
/*扩展补充*/
 
//判断一个非数组变量是否为空
if(typeof a != 'undefined' && a ){}
 
//判断一个数组变量是否为空
if (typeof a !=undefined&& a && a.length > 0) {}

总结

方法基础数据类型引用类型注意事项
typeof×简单易用,但对某些特殊值判断不准确。
instanceof×适用于判断对象的具体类型,但对基本数据类型不适用。
Object.prototype.toString.call()最全面的判断方法,适用于各种类型。
constructor√ 部分可以处理基本数据类型,但在继承情况下需要注意调整指向。
严格对等 ===√ 部分主要用于简单的条件判断,但对于复杂的数据类型判断不够全面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值