数据类型分类
JS中的数据类型可分为两类:简单数据类型(原始数据类型)(7种) and 复杂数据类型(引用数据类型)(1种)。
简单数据类型(原始数据类型)
- number
- string
- boolean
- undefined
- null
- symbol (ES6新增)
- bigint (ES6新增)
原始数据类型(简单) 存储在
栈中,占据空间小、大小固定、会被频繁使用。
1 . number 类型
(1) 十六进制是以 0 开头的
(2) 科学计数法: xxx e/E x
例: 3.12e7 就是 3.12 * 10 的 7 次方
(3) 值的范围
ES 可以表示的最大值保存在
Number.MAX_VALUE中,最小值保存在Number.MIN_VALUE中,超过这两个范围,就会被自动转化成一个特殊的值 Infinity 或者 - Infinity ,无穷大、无穷小的意思,这两个值不能参与任何运算!!!
(4) NaN (numbe类型的一种)
用来表示不是数值,指的是本来要返回的数值操作失败了,不是报错!!
例:
-
0 / 0 ------> NAN
-
5 / 0 ------> Infinity
注意 :
-
涉及 NaN 的操作始终返回 NaN
-
NaN 不与包括 NaN 在内的任何值相等!!!
-
NaN的数据类型判断(isNaN vs Number.isNaN)
- isNaN直译为“是不是 NaN”,但是其本意不是,`isNaN本意`是通过Number方法把参数转换成数字类型,
如若转换成功,则返回false,反之返回true,**它只是判断参数是否能转成数字,不能用来判断是否严格等于NaN。**
如果要判断某个值是否严格等于NaN不能用这个方法。
- ES6提供了Number.isNaN()方法用来判断一个值是否`严格等于`NaN,它会首先判断传入的值是否为数字类型,
如不是,直接返回false。
console.log(isNaN('aaa')); // true
console.log(Number.isNaN('aaa')) // false
(5) 数值转换
-
字符串转数值
- Number( str ) - parseInt( str , x) // 其中 x 表示的是要将该字符串按 x进制的形式进行转换!!parseFloat() 只能转换 10进制
(6) 不区分整数和浮点数,只有 number一种类型!!!
2. string 类型
ES 中的字符串可以以 单引号 、双引号、反引号引用,没有区别。
(1) 字符字面量
\t 制表 \n 换行
(2) 字符串是不可改变的,要修改,需要先销毁原先的字符串
(3) 类型转换为字符串 toString() 或者 String()
- 如果是数值进行调用 ,toString() 方法可以接收一个参数 x ,即把该数值按照 x 进制的形式进行转换!!!
- String( null ) -------> "null"
- String( undefined ) ---------> "undefined"
(4) 模板字符串 (反引号引用的)
-
可以定义换行的字符串
-
可以进行插值 ${}
3. undefined
undefined 是一个假值!!!
- 对于
未声明和声明了但没有赋值进行初始化的,用typeof都会返回 undefined
4. null
- 一般是我们给某个变量赋值为 null !!!
- null 和 undefined表面上是相等的,即 null == undefined 始终返回 true!!!
5. symbol (创建唯一记号,解决命名冲突问题)
let a = Symbol("foo") let b = Symbol("foo")
a == b // false
- 如果要共享和重用 Symbol 实例 ,可以用
Symbol.for()方法,例如 Symbol.for("a") 会先检查全局有没有用字符串"a" 注册的符号,有就用它,没有就新建一个。 - 可以用来做属性名(有效避免命名冲突)!!
// 创建一个`Symbol` const a = Symbol()
// 创建一个对象 const obj = {}
// 通过`obj[]`将`Symbol`作为对象的键 obj[a] = 'hello world'
6. bigint
bigInt是一种 number 类型的数据,它可以表示任意精度格式的整数,使用它可以安全地存储和操作大整数!!即使该数已经超出了 number 能够表示的安全整数范围!!!
复杂数据类型(引用数据类型)
- object
引用数据类型(复杂) 存储在
堆中,占据空间大,大小不固定。如果存储在栈中,会影响程序运行的性能!!!引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。 当解释器寻找引用值时,会先检索其在栈中的地址,取得地址后从堆中获得实体!!!
(补)堆栈区别
栈区内存由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。堆区内存一般由开发者分配释放,若开发者不释放,程序结束时可能由垃圾回收机制回收。