一、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)
- Number:用于表示数字,可以是整数或浮点数。例如:
let num = 42; let pi = 3.14;
。 - String:表示文本数据,用单引号或双引号括起来。例如:
let str = 'Hello, world!';
。 - Boolean:只有两个值,true和false,用于表示逻辑状态。例如:
let isTrue = true;
。 - Null:表示一个空值,通常用于初始化变量或表示对象不存在。例如:
let emptyValue = null;
。 - Undefined:表示一个未初始化的变量或者没有返回值的函数的结果。例如:
let notAssigned;
,此时这个变量的值就是undefined
。 - Symbol(ES6 引入):一种唯一的、不可变的数据类型,通常用于作为对象属性的标识符。例如:
let sym = Symbol('description');
。
2、引用数据类型(Reference Data Types)
- Object:可以存储多个键值对,键可以是字符串或 Symbol,值可以是任何数据类型。例如:
let obj = { key: 'value' };。
- Array:用于存储一组有序的数据,可以包含不同类型的数据。例如:
let arr = [1, 'two', true];
。 - Function:在 JavaScript 中,函数也是一种对象,可以作为变量传递、作为参数传递给其他函数或从函数中返回。例如:
function add(a, b) { return a + b; }
。 - Date:用于处理日期和时间。例如:
let now = new Date();
。 - RegExp:正则表达式对象,用于匹配文本中的模式。例如:
let regex = /\d+/;
。 - Map(ES6 引入):键值对的集合,其中键和值可以是任何类型。例如:
let myMap = new Map(); myMap.set('key', 'value');
。 - Set(ES6 引入):一组唯一值的集合。例如:
let mySet = new Set(); mySet.add(1);
。
二、JS 中判断数据类型的方法
1.typeof
其中typeof返回的类型都是 字符串 形式,需注意!!!
- 只能识别基础类型和引用类型 注意:
null
、NaN
、document.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 | √ 部分 | √ | 可以处理基本数据类型,但在继承情况下需要注意调整指向。 |
严格对等 === | √ 部分 | √ | 主要用于简单的条件判断,但对于复杂的数据类型判断不够全面。 |