JavaScript篇-数据类型
1.数据类型:
- 原始数据类型: String Null Undefined Boolean Number
- 引用数据类型: Object Array Function
- ES6新引入:
a) Symbol:代表创建后独一无二且不可变的数据类型,它主要是为了解决可能出现的全局变量冲突的问题
b)BigInt:是一种数字类型的数据,它可以表示任意精度格式的整数,使用 BigInt 可以安全地存储和操作大整数,即使这个数已经超出了Number 能够表示的安全整数范围
原始数据类型和引用数据类型有什么区别呢?答:存放的位置不同,基本数据类型存放在栈区,引用数据类型存放在堆区。
2.操作系统中的内存:
操作系统中内存分为栈区和堆区
栈:栈区内存由编译器自动分配和释放,存放参数,变量等值。存放占据空间小大小固定被频繁使用的基本数据类型。
堆:堆区内存由开发者释放,开发者不释放程序结束时会由垃圾回收机制回收。存放占据空间大、大小不固定的引用数据类型的指针,指针指向存放实体的地址。
2. Undefined和Null的区别
一般变量声明了但还没有定义的时候会返回undefined,null 主要用于赋值给一些可能会返回对象的变量,作为初始化
Undefined:未定义
Null:空对象
undefined == null // true,undefined === null // false
4.判断数据类型
1.typeof: 无法区分null 数组和 对象
-
- typeof( 2 ) // number
- typeof( true ) // boolean
- typeof( 'helloworld' ) // string
- typeof( undefined ) // undefined
- typeof ( function(){} ) // function
- typeof( null ) // object
- typeof( {} ) // object
- typeof( [] ) // object
2.instanceof: 运行机制是判断在其原型链中是否能找到该类型的原型,无法判断基本数据类型
-
- [] instanceof Array // true
-
- {} instanceof Object // true
- function(){} instanceof Function // true
-
- 2 instanceof Number // false
3.constructor: 1.判断数据类型;2.通过对象实例访问构造函数(如果对象原型被修改过那就不能访问构造函数了)
-
- ( 2 ).constructor === Number // true
- ( [] ).constructor === Array // true
- ( function(){} ).constructor === Function // true
- ( true ).constructor === Boolean // true
4. Object.prototype.toString.call() 用对象原型的toString()来判断(不能直接用 [].toString(),因为Array、function等类型作为 Object 的实例,都重写了 toString 方法,此处包含原型链知识后续讲解)
let typeT = Object.prototype.toString
- typeT.call([]) // '[object Array]'
- typeT.call({}) // '[object Object]'
- typeT.call(2) // '[object Number]'