数据类型两大分类
原名 | 类型名 | 英文名 | 英文汉语 | 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?
- 操作符运算时,有一个不是数字
- 如何可靠地测试一个值是否等于NaN?
- 可用内置函数isNaN()判断,但也不完全可靠。
- es6的Number.isNaN()判断更加可靠
布尔(boolean)类型:
- 布尔是一个人。发明了对立逻辑:true、false
- 布尔逻辑:真和假(推到计算机的0和1),(逻辑学三段式)是二元论的一个分支
- 计算机基础的语言——机械码,就是0、1组成的。有了0和1就有了计算机。
字符串(string)类型:
包装类
字符串、数字和布尔值一样,都有包装类的概念,但是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 |
作为函数的参数,表示函数的参数不是对象 作为对象原型链的终点 |
原始值 | 二者都是超级原始值,没有属性和方法 |
undefined和null没有属性和方法:
undefined和null不可以有属性,因为二者就是最原始的原始值,二者都没有原型,也就不可能有属性和方法,更不可能经过包装类,固然也不能使用像toString这种在原型链上的的方法了。
与string、number、boolean这仨不同的是,人家三个会经过包装类,所以还可以添加属性。
注意:undefined和null不能用toString这个方法(详见类型转换-显示-toString部分),因为他俩没有原型链、也不是对象,就是原始值。以下写法都报错