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 中关于数据类型的相关知识点,包括数据类型的分类,以及如何正确的检测这些类型的方法。