JS基础梳理: 数据类型及检测方法
我们都知道,在最开始接触一门新的语言时,首先要了解的便是语言的数据类型,今天的内容就和 JS 中的数据类型有关,所以,今天我们主要的内容便是:梳理 JS 中的数据类型,以及如何有效地检测这些类型。
文章目录
1. JS 数据类型
JS 数据类型分为两大类:原始类型和对象类型。原始类型主要包括 7 钟,在这 7 钟原始类型中,有两个原始类型是 ES6 新增的,它们分别是:undefined、null、Boolean、Number、String、Symbol 和 BigInt。
1.1 原始类型
下面整理了 JS 中所有原始类型:
undefined:表示未定义类型,只有一个值就是undefined。当一个变量被声明但没有赋值时,它的值就是undefined。Null:空值类型,只有一个值null。它表示一个空的对象引用。需要注意的是,虽然undefined和null都表示“无”,但它们的含义是不同的。undefined表示“未定义”,也就是说一个变量被声明了但是没有被赋值;而null表示“空”,表示一个变量被赋值为一个空对象引用。Boolean:布尔类型,有两个值,分别是true和false。undefined转化成Boolean类型后是false,同样的,null转化成Boolean类型后也是false。Number:数值类型,包括整数和浮点数。值得一提的是,JS 中所有的数字都是 64 位浮点数,包括整数。String:字符串类型,表示一组字符。在 JS 中,字符串是不可变的。一旦字符串被创建,它的值就不能被修改。如果想修改一个字符串,只能创建一个新的字符串。这是因为字符串是原始类型,它们是不可变的,而不是可以被修改的对象。Symbol(ES6引入):符号类型,它的实例是唯一且不可变的。即使它们的名称相同,不同的Symbol值之间也是不相等的。并且,一旦创建了Symbol值,就不能再修改它的值了。Symbol值可以作为对象属性的唯一标识符,由于每个Symbol值都是唯一的,因此可以用它们作为对象属性的键,这样可以确保不会发生命名冲突的情况。Symbol 值还可以用作常量,可确保常量的唯一性,比如,可以用Symbol.for()方法来创建一个全局的Symbol值,这个值可以被多个代码模块共享。BigInt(ES6引入):表示任意精度的大整数,它可以用来表示超过 JS 中Number类型能够表示的最大值的整数。不过,BigInt很少用于一般的 Web 开发,但在某些领域中非常有用。例如,密码学和金融领域中需要处理大数值时,就需要使用BigInt类型。
1.2 对象类型
JS 中常见的有下面这三个对象类型,它们分别是:
Object:一个普通的对象,可以通过字面量{}或者new Object()来创建,它是 JS 中最常用的对象之一。Array:表示一个元素列表,可以通过字面量[]或者new Array()来创建,它同样是 JS 中最常见的对象之一。Function:表示一个可执行的代码块,可以通过函数声明或者函数表达式来创建。
除以上三个类型之外,还有许多其他的内置对象类型,如 Date、RegExp、Map、Set 等。
Date:表示日期和时间的对象类型。
可以使用new Date()方法创建一个Date对象,或者使用时间戳的方式来创建一个Date对象。例如,new Date(1625064919000)创建的对象表示的是时间戳所对应的日期和时间。Date对象有许多方法,可以用于获取日期和时间的信息,如getFullYear()、getMonth()和getDate()等方法,也可以用于将日期格式化为字符串,如toDateString()和toLocaleDateString()等方法。
可以通过new Date()来创建一个Date对象,或者使用时间戳的方式来创建一个Date对象。比如,new Date(1625064919000)创建的对象表示的是时间戳所对应的日期和时间。RegExp:表示正则表达式的对象类型。RegExp是 JavaScript 中的一个内置对象类型,用于表示正则表达式。正则表达式是一种用于匹配字符串中特定模式的表达式。在 JavaScript 中,正则表达式可以用于搜索、替换和验证字符串。RegExp对象有许多方法,常用的方法包括test()、exec()、match()、search()、replace()等。
例如,test()方法用于测试一个字符串是否匹配一个正则表达式。它返回一个布尔值,表示字符串是否匹配模式。下面的示例代码演示了如何使用test()方法:
const pattern = /hello/;
const str = 'hello world';
console.log(pattern.test(str)); // true在上面的示例代码中,pattern 表示一个正则表达式,str 表示一个字符串。pattern.test(str) 返回 true,表示字符串 str 包含模式 pattern。
Map:表示键值对的集合的对象类型Set:表示无序元素的集合的对象类型,它表示无序元素的集合。
与数组不同,Set存储的元素是唯一的,不允许重复,因此可以用它来去除数组中的重复元素。比如面试和工作中常见的如何给一个数组去重,就可以用Set。Set对象有许多方法,可以用于添加元素、删除元素、检查元素是否存在等操作。比如常用的方法有add()、delete()和has()等。
可以使用new Set()来创建一个空的Set对象,然后使用add()方法向Set中添加元素,使用delete()方法删除元素,使用has()方法检查元素是否存在。此外,还可以使用size属性获取Set对象中元素的数量,使用forEach()方法遍历Set中的元素等。这些方法的用法和Map中的类似。
2. 数据类型检测
JS 中有很多数据类型,那我们该如何正确的检测这些数据类型呢?
2.1 typeof 运算符
这是一种常见的检测原始数据类型的方法。比如,typeof 123 返回 "number",typeof "abc" 返回 "string"。但是,它有一些限制:
- 检测原始数据类型的限制:
typeof null返回"object",这是一个历史遗留问题。 - 检测对象数据类型的限制:对于数组和对象,
typeof都会返回"object",这使得我们无法区分它们。
如果只是判断某个值的类型是不是除 null 以外的其他原始类型,那么,typeof 是最简单的。
2.2 instanceof 运算符
这个运算符用来检测一个对象是否是一个特定构造函数的实例。例如,[] instanceof Array 返回 true,{} instanceof Object 返回 true。但 instanceof 无法正确检测原始类型的值,因为它们不是对象。
2.3 constructor 属性
每个 JS 对象都有一个 constructor 属性,指向创建该对象的构造函数。例如,(123).constructor === Number 和 ("abc").constructor === String 都返回true。但是,这种方法也有其局限性,因为 constructor 属性是可以被修改的。
这种方法不推荐,但是需要知道,作为了解即可。
2.4 Array.isArray() 方法
这是一个静态方法,用来检测一个值是否是数组。例如,Array.isArray([]) 返回 true,Array.isArray({}) 返回 false。这是检测数组最可靠的方式。
如果只需要单纯的检测某个值是否是数组,那么,isArray 是最方便、可靠的。
2.5 toString.call() 方法
这是一种更可靠的,也可以说是更为完美的类型检测方法,它可以正确区分所有的内置类型。例如,Object.prototype.toString.call([]) 返回 "[object Array]",Object.prototype.toString.call({}) 返回 "[object Object]",Object.prototype.toString.call(null) 返回 "[object Null]",Object.prototype.toString.call(undefined) 返回 "[object Undefined]"。
通常,在一个函数中需要判断参数类型时,可以使用该方法。此外,在开发某些工具库或插件时,也可能需要使用该方法来判断传入参数的类型,以确保代码的正确性和稳定性。
3. 小结
今天我们主要梳理并分享了 JS 中关于数据类型的相关知识点,包括数据类型的分类,以及如何正确的检测这些类型的方法。
