数据类型

Mr.ZhaoAbout 4 min

数据类型是指存储在内存中的数据的类型,通常分为两大类 基本数据类型复杂数据类型

1. 基本数据类型

基本数据类型又叫做简单类型或者值类型,在存储时变量中存储的是值本身,因此叫做值类型,如 string,number,boolean,undefined,null

  1. 数值类型(number)
    • 一切数字都是数值类型(包括二进制,十进制,十六进制等)
    • NaN(not a number),一个非数字,NaN 代表一个计算错误,它是一个不正确的或一个未定义的数学操作所得到的结果,NaN 是粘性的,任何对 NaN 的操作都会返回 NaN
  2. 字符串类型(string)
    • 被引号包裹的所有内容(可以是单引号''也可以是双引号""),单引号和双引号没有本质上的区别,推荐使用单引号
    • 注意:
      • 无论单引号或是双引号必须成对使用
      • 单引号/双引号可以互相嵌套,但是不可以自已嵌套自已
      • 必要时可以使用转义符 \,输出单引号或双引号
  3. 布尔类型(boolean)
    • 只有两个(true 或者 false
  4. null类型(null)
    • 只有一个,就是 null,表示”空“、”无“或”值未知“的意思
  5. 未定义类型(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() 方法,比如 undefinednull
  • String(变量)

    • 所有数据类型都可以
  • 使用加法运算

    • 在 JS 里面,+ 由两个含义
      • 字符串拼接: 只要 + 任意一边是字符串,就会进行字符串拼接
      • 加法运算:只有 + 两边都是数字的时候,才会进行数学运算

4.3 其他数据类型转成布尔

  • Boolean(变量)
    • 在 js 中,只有 ''0nullundefinedNaN,这些是 false
    • 其余都是 true

5. 数据类型之间存储的区别

既然我们区分了基本数据类型和复杂数据类型,那么他们之间就一定会存在一些区别,他们最大的区别就是在存储上的区别

我们的存储空间分成两种:

  • 栈: 主要存储基本数据类型的内容

  • 堆: 主要存储复杂数据类型的内容

5.1 基本数据类型在内存中的存储情况

var num = 100,在内存中的存储情况,直接在 栈空间 内有存储一个数据

5.2 复杂数据类型在内存中的存储情况

复杂数据类型的存储

  1. 在堆里面开辟一个存储空间

  2. 把数据存储到存储空间内

  3. 把存储空间的地址赋值给栈里面的变量

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

因为我们创建了两个对象,那么就会在 堆空间 里面开辟两个存储空间存储数据(两个地址),虽然存储的内容是一样的,那么也是两个存储空间,两个地址,复杂数据类型之间就是地址的比较,所以 objobj2 两个变量的地址不一样,所以我们得到的就是 false