数据类型
About 4 min
数据类型是指存储在内存中的数据的类型,通常分为两大类 基本数据类型 和 复杂数据类型
1. 基本数据类型
基本数据类型又叫做简单类型或者值类型,在存储时变量中存储的是值本身,因此叫做值类型,如 string,number,boolean,undefined,null
- 数值类型(number)
- 一切数字都是数值类型(包括二进制,十进制,十六进制等)
NaN
(not a number),一个非数字,NaN 代表一个计算错误,它是一个不正确的或一个未定义的数学操作所得到的结果,NaN 是粘性的,任何对 NaN 的操作都会返回 NaN
- 字符串类型(string)
- 被引号包裹的所有内容(可以是单引号
''
也可以是双引号""
),单引号和双引号没有本质上的区别,推荐使用单引号 - 注意:
- 无论单引号或是双引号必须成对使用
- 单引号/双引号可以互相嵌套,但是不可以自已嵌套自已
- 必要时可以使用转义符
\
,输出单引号或双引号
- 被引号包裹的所有内容(可以是单引号
- 布尔类型(boolean)
- 只有两个(
true
或者false
)
- 只有两个(
- null类型(null)
- 只有一个,就是
null
,表示”空“、”无“或”值未知“的意思
- 只有一个,就是
- 未定义类型(undefined)
- 未定义是比较特殊的类型,只有一个值 undefined,只声明变量,不赋值的情况下,变量的默认值为 undefined,一般很少直接为某个变量赋值为 undefined
2. 复杂数据类型
复杂数据类型,在存储时变量中存储的仅仅是地址(引用),因此叫做引用数据类型
通过 new 关键字创建的对象(系统对象、自定义对象),如 Object、Array、Date 等
3. 判断数据类型
使用 typeof
关键字来检测数据类型
// 第一种使用方式
var n1 = 100
console.log(typeof n1)// number
// 第二种使用方式
var s1 = 'abcdefg'
console.log(typeof(s1))// string
4. 数据类型转换
数据类型之间的转换,比如数字转成字符串,字符串转成布尔,布尔转成数字等
JavaScript 是弱类型语言:JavaScript 也不知道变量到底属于哪种数据类型,只有赋值了才清楚
4.1 其他数据类型转成数值
Number(变量)
- 可以把一个变量强制转换成数值类型
- 可以转换小数,会保留小数
- 可以转换布尔值
- 遇到不可转换的都会返回
NaN
parseInt(变量)
- 从第一位开始检查,是数字就转换,直到一个不是数字的内容
- 开头就不是数字,那么直接返回
NaN
- 不认识小数点,只能保留整数
parseFloat(变量)
- 从第一位开始检查,是数字就转换,直到一个不是数字的内容
- 开头就不是数字,那么直接返回
NaN
- 认识一次小数点
除了加法以外的数学运算
- 运算符两边都是可运算数字才行
- 如果运算符任何一边不是一个可运算数字,那么就会返回
NaN
- 加法不可以用
4.2 其他数据类型转成字符串
变量.toString()
- 有一些数据类型不能使用
toString()
方法,比如undefined
和null
- 有一些数据类型不能使用
String(变量)
- 所有数据类型都可以
使用加法运算
- 在 JS 里面,
+
由两个含义- 字符串拼接: 只要
+
任意一边是字符串,就会进行字符串拼接 - 加法运算:只有
+
两边都是数字的时候,才会进行数学运算
- 字符串拼接: 只要
- 在 JS 里面,
4.3 其他数据类型转成布尔
Boolean(变量)
- 在 js 中,只有
''
、0
、null
、undefined
、NaN
,这些是false
- 其余都是
true
- 在 js 中,只有
5. 数据类型之间存储的区别
既然我们区分了基本数据类型和复杂数据类型,那么他们之间就一定会存在一些区别,他们最大的区别就是在存储上的区别
我们的存储空间分成两种:
栈: 主要存储基本数据类型的内容
堆: 主要存储复杂数据类型的内容
5.1 基本数据类型在内存中的存储情况
var num = 100
,在内存中的存储情况,直接在 栈空间 内有存储一个数据
5.2 复杂数据类型在内存中的存储情况
复杂数据类型的存储
在堆里面开辟一个存储空间
把数据存储到存储空间内
把存储空间的地址赋值给栈里面的变量
6. 数据类型之间比较的区别
基本数据类型是 值 之间的比较
var num = 1
var str = '1'
console.log(num == str) // true
复杂数据类型是 地址 之间的比较
var obj = { name: 'Jack' }
var obj2 = { name: 'Jack' }
console.log(obj == obj2) // false
因为我们创建了两个对象,那么就会在 堆空间 里面开辟两个存储空间存储数据(两个地址),虽然存储的内容是一样的,那么也是两个存储空间,两个地址,复杂数据类型之间就是地址的比较,所以 obj
和 obj2
两个变量的地址不一样,所以我们得到的就是 false