JavaScript基础 数据类型
前言
今天到厂里面试问道一个问题答不上来,记录一下理解后的结果,先是问typeof会返回哪些数据类型,接着继续问基本数据类型有哪些,继续问es6新增的有哪些.
然后难点来了,怎么区分基本数据类型和引用数据类型
数据类型
typeof返回哪些数据类型
number string boolean undefined object function symbol bigint (8)
基本数据类型有哪些
es5: number string Boolean undefined null (5)
es6新增:symbol BigInt(2)
引用数据类型有哪些
object
数据类型区别
基本数据类型和引用数据类型的区别
- 首先这里涉及两个内存:栈内存,堆内存
- 栈内存是有序的,堆内存是无序的
- 基础数据类型的数据 (原始值)会直接保存在栈内存里面
- 引用数据类型的数据(引用值)会保存在堆内存里面,然后把引用值存在栈内存里
因此如果添加let e = d,栈里面会多一个e的变量名,e的值和d的值一样,指向一样的地址;
所以这时如果给e.a赋值e.a=1,那么0x1001的变量会发生改变,又因为d指向一个地址,所以他的e.a也会变成1
怎么区分基本数据类型和引用数据类型
在读取某个原始值的时候,javaScript后台会为他们创建对应原始包装类型对象(Boolean,String,Number)
以读模式访问变量的时候,会执行以下三步:
- 创建一个原始值类型的实例(如new String())
- 调用实例中的方法
- 销毁对象
/*以string为例*/
let str = "1,2" ;
let str2 = str.split(",") ;
/*后台处理实际可以理解为下面这个操作*/
let str = new String("1,2") ;
let str2 = str.split(",") ;
str = null ;
所以怎么区分原始值还是应用值(以string类型为例)
1 let str = "1,2" ;
2 str.color = "red" ; //不报错
3 console.log( str.color ) ;// 打印出来undefined
/* 第2行代码,以读模式访问变量->创建 String("1,2")对象,给color属性赋值;然后销毁对象*/
/*
* 第3行代码,以读模式访问变量->创建 String("1,2")对象,读取color属性, 由于这是新对象,
* 第二行的对象已经被销毁,所以color属性是新对象里面的color,是undefined
*/
综上:原始值没有属性,引用值有属性;由此可以分别添加一个属性并初始化值,判断是否undefined来判断区分出来。
总结
如果有什么问题,可以私聊及时指出