又到一学期一度的考试周了,有一句话说的好,上大学就是温水泡脚然后最后把泡脚水喝掉。但我没泡上脚还得喝洗脚水,一门又一门的考试,难受了哥们。不过在这学期我也收获了许多,对前端的理解更加深入。最近我发现在js中我忽略了很多关于数据类型的细节,我想可能对大伙能有所帮助,也让我们重温一下js数据类型,本文将涵盖类型判断以及类型转换等等知识点。
js中有哪些数据类型
原始数据类型
- Number - 表示数字,可以是整数或浮点数(不分区),包括
Infinity
,-Infinity
, 和NaN
。 - String - 由一个或多个字符组成的文本,可以用单引号
' '
或双引号" "
包裹。 - Boolean - 布尔值,只有两个值:
true
和false
。 - Undefined - 表示一个未被初始化的变量,只有一个值
undefined
。 - Null - 表示一个空对象指针,只有一个值
null
。 - BigInt - ES2020引入,用于表示大于
2^53 - 1
的整数。 - Symbol - ES6引入,用于创建唯一的标识符,常用于对象的属性键。
引用数据类型
- Array - 特殊类型的对象,用于存储有序的元素集合,元素可以是任意类型。
- Map - ES6引入,键值对的集合,键可以是任何类型。
- Set - ES6引入,不重复值得集合。
- Object - 无序属性的集合,属性可以是任何类型。包括普通对象、数组(
Array
)、函数(Function
)、日期(Date
)、正则(RegExp
)等。 - Function - 函数也是一种对象,可以被当作值来传递,拥有属性和方法。
好的,回顾了各种数据类型接下来进入正题。
类型判断
在js中对类型的准确判断可以避免很多错误的发生,可不能轻视。
几种常用判断方法:
typeof
- 适用范围:几乎适用于所有类型,但不包括
null
(会被误判为'object'
)。 - 原理:通过查看值的二进制表示的前几位来确定类型,函数类型的二进制前三位非零,而大多数引用类型前三位为0。
- 示例:
typeof "hello"
返回'string'
。
instanceof
- 适用范围:仅限于对象,用于检测构造函数的原型链上是否存在指定类型。
- 原理:沿着对象的原型链向上遍历,检查是否能找到构造函数的
prototype
属性。 - 示例:
(new Date) instanceof Date
返回true
。
Object.prototype.toString
- 特点:这是最全面的类型检测方法,能准确区分所有原始类型及引用类型。
- 原理:每个对象都有一个内部属性[[Class]],
Object.prototype.toString
能返回该属性的值,格式为'[object Type]'
,其中Type
是对象类型。 - 示例:
Object.prototype.toString.call(123)
返回'[object Number]'
。
Array.isArray
- 特定用途:专门用于检测一个值是否为数组。
- 优点:相比于
instanceof
,它不依赖于构造函数,因此在跨iframe或不同全局执行环境下也能正确判断。 - 示例:
Array.isArray([])
返回true
。
类型转换
JavaScript支持两种类型转换方式:显式类型转换和隐式类型转换。
显式类型转换
显式类型转换是开发者主动要求的转换
常用方法
- Boolean(x): 将任何值转换为布尔值。除零、空字符串、null、undefined、NaN和false外,其他值均转换为true。
- Number(x): 将任何值转换为数值。例如,字符串"123"转为123,"true"转为1,"false"转为0。
- String(x): 将任何值转换为字符串。如数字123转为"123",布尔值true转为"true"。
隐式类型转换
当对象参与需要原始值的操作时,JavaScript会自动进行隐式类型转换。
常用方法
- 转Number:
ToPrimitive(obj, Number)
首先尝试调用valueOf()
,若返回原始值则使用;否则调用toString()
。若两者都不返回原始值,则抛出TypeError。 - 转String:
ToString(obj)
首先尝试调用toString()
,若成功则返回;失败后再尝试valueOf()
。同样,两者都不成功时抛出错误。 - 对象转布尔: 对象在隐式转换为布尔值时,不论对象内容如何,一律被视为true。
- 一元操作符: 一元加操作符
+
,当作用于非数值时,会尝试将其转换为数值类型。例如,+""
(空字符串转为0),+"123"
(字符串"123"转为数值123)。 - 二元运算符+: 如果一方为字符串,另一方无论何种类型,都会被转换为字符串,然后进行拼接。若两边均为数值或可转换为数值的原始值,则执行加法运算。
下表可以帮助你于大部分使用场景下:
结语
数据类型是一门语言的基础,其转换与判断更是我们需要掌握的一项核心技能,它关乎如何在不同数据类型间灵活转换,以满足特定的运算或逻辑需求,不报出小红句。而现在,我也要回到考试周的复习中了,希望这篇文章可以加深你对数据类型的理解,如果有什么遗漏或者疑问欢迎评论。