包装类、堆栈内存、

数据类型两大分类

原名 类型名 英文名 英文汉语 c语言名 所有值 特点
原始值 简单数据类型 stack 栈数据 原子类型
(不可再细分)

- string
- number
- boolean
- null
- undefined
- symbol (es6新增)
原始值是不能有属性和方法的。
而且坚决没有属性和方法的,他们没有资格有属性和方法。他只是值,是一个独立的个体存在。
引用值 复杂数据类型 heap 堆数据 结构类型
1. object对象
2. array数组
3. function函数类对象
4. date
5. RegExp
6. error
属性和方法只有对象能有,这是对象特点。

原始值和引用值的区别

原始值 引用值
原始值都是一个具体的值,是一个独立的个体。 引用值都是一种对象。
原始值放在栈内存中,
没有属性和方法
引用值放在堆内存中,
有自己的属性和方法
原始数据类型是直接存储在栈(stack)中的简单数据段。
占据空间小、大小固定。
属于被频繁使用的数据,所以放入栈中存储。
引用数据类型存储在堆(heap)中的对象,
占据空间大、大小不固定。
如果存储在栈中,将会影响程序运行的性能。
原始数据类型在栈中存储了实体。 引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。
当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体

基本数据类型(原始值)

数字(number)类型:

  • 数字类型天生是浮点型,不是整型(intiger)
  • Infinity和NaN都是Number类型。
  • 100.00为number格式时,转过来在html或控制台输出的为100整

    特殊数字类型 - NaN:

  • 什么是NaN?

    • NaN属性表示“不是数字”的值
  • 他的类型是什么?
    • 数字
  • 他有什么特点?
    • 表示“不是数字”、但类型是数字
      • typeof NaN // 得到”number”
    • NaN不等于任何值。甚至不等于自己。
      • NaN === NaN // 得到false
      • 好像一个时间戳,谁和谁也不一样
  • 他是怎么来的?
    • 由于一个操作数是非数字(如”abc”/4 = NaN)
    • 因为操作的结果是非数字而无法执行【?】
  • 有哪几种情况会得到NaN?
    • 操作符运算时,有一个不是数字

image.png

  • 如何可靠地测试一个值是否等于NaN?
    • 可用内置函数isNaN()判断,但也不完全可靠。
    • es6的Number.isNaN()判断更加可靠

MDN文档示例

布尔(boolean)类型:

  • 布尔是一个人。发明了对立逻辑:true、false
  • 布尔逻辑:真和假(推到计算机的0和1),(逻辑学三段式)是二元论的一个分支
  • 计算机基础的语言——机械码,就是0、1组成的。有了0和1就有了计算机。

字符串(string)类型:

和数字、布尔值一样,都有包装类的概念
image.png

包装类

字符串、数字和布尔值一样,都有包装类的概念,但是undefined和null没有。

未定义 undefined:

  • undefined是一个数据类型。类型下只有undefined这一个值。
  • undefined值代表变量经过声明、但还没有定义/赋值。
  • 一般情况下声明了一个变量没有赋值,则这个变量的值自动就是undefined。

空 null:

  • 表示一种占位

比较undefined和null

undefined和null共同点:

都是基本的数据类型
没有也不可能有属性和方法(下)

undefined和null的区别:

类别 undefined null
含义 表示“无”的原始值 表示“无”的对象。
表示 表示“缺少值” 表示尚未存在的对象 -“没值”、“没有对象”
详解 此处应该有一个值,但还没有定义 函数企图返回一个不存在的对象
转为数字 Number(undefined) = NaN Number(null) = 0
出现
场景
声明的变量未被初始化(未赋值),变量默认值为undefined
调用函数时,该传递的参数没传递,则形参是undefined
获取对象上不存在的属性,返回undefined
函数没有返回值时,获取函数调用结果得到undefined
作为函数的参数,表示函数的参数不是对象
作为对象原型链的终点
原始值 二者都是超级原始值,没有属性和方法

image.png

undefined和null没有属性和方法:

undefined和null不可以有属性,因为二者就是最原始的原始值,二者都没有原型,也就不可能有属性和方法,更不可能经过包装类,固然也不能使用像toString这种在原型链上的的方法了。

与string、number、boolean这仨不同的是,人家三个会经过包装类,所以还可以添加属性。
image.png

注意:undefined和null不能用toString这个方法(详见类型转换-显示-toString部分),因为他俩没有原型链、也不是对象,就是原始值。以下写法都报错
image.png

面试题

JS中都有哪些数据类型