一、数据类型
1.1、分类
- 基本数据类型
字符串类型(String)、数字类型( Number)、布尔类型( Boolean)、空( Null)、未定义( Undefined)Symbol类型,总共6种
注:Symbol 是 ES6 引入了一种新的原始数据类型,表示独一无二的值。
- 引用数据类型
引用数据类型就只有Object类型,这包括数组(array)、对象(object)、函数(function)等
1.2、常见面试题
-
如何理解值类型和引用类型?
答:值类型占用的空间大小固定,保存在栈里面,操作的是值本身;引用类型占用空间不固定,保存在堆中,操作的是指向对象的一个指针
-
Null、Undefined、{} 之间的区别?
描述 数据类型 强转布尔值 null 是一个对象指针,只不过就是没有指向任何对象 Object undefined undefined是一个空值 Undefined {} 是一个对象指针,指向空对象 Object
二、栈、堆内存
2.1、概念
在js引擎中对变量的存储主要有两种位置,堆内存和栈内存。
栈内存:主要用于存储各种基本类型的变量,包括Boolean、Number、String、Undefined、Null,以及对象变量的指针,这时候栈内存给人的感觉就像一个线性排列的空间,每个小单元大小基本相等,它内部遵循先进后出;如下图:a 最先进栈,最后出栈
堆内存:主要负责像对象Object这种变量类型的存储,这种引用类型的数据会在堆内存中开辟出一片内存空间,并且会有一个十六进制的内存地址,在栈内存中声明的变量的值就是十六进制的内存地址如下图
注意:函数也是引用数据类型,我们定一个函数的时候,会在堆内存中开辟空间,会以字符串的形式存储到堆内存中去,如下图:
注意(两者在存储大小方面的区别):
栈内存中的变量一般都是已知大小或者有范围上限,算作一种简单存储。
堆内存存储的对象类型数据对于大小这方面,一般都是未知的
2.2、常见面试题
输出结果是多少?
var a = {n: 1};
var b = a;
a.x = a = {n: 2};
console.log(a.x) // undefined
console.log(b.x) // { n:2}
代码解析:
1、第一步,var变量提升,在栈中生命两个变量a,b,地址分别为1x0001和1x0002
2、第二步,在堆中开辟空间1,存储对象{n:1},赋值给变量a,a的指针指向空间1
3、然后b引用了a,就是b的指针也指向了空间1
4、这里对对象属性的操作是优先于复制操作的,也就是说要先执行a.x,然后再继续从右往左执行,那么就是先在堆空间1中声明属性x,此时x的值为undefined
5、然后执行{n:2},就是在堆中开辟空间2{n:2},然后赋值给a,a的指针指向空间2
6、a.x = a 这个时候要分清楚两个变量的指针是不一样的,a.x的指针是指向空间1,可以理解a.x就是b.x,而a的指针是指向空间2的,此时赋值,就是空间1的属性x赋值为空间2的值{n:2}
7、所以空间1里的值是{n:1,x:{n:2}},空间2的值{n:2}
a的指针指向空间2,b的指针指向空间1
小结:上面面试题中有个知识点就是要属性的赋值"."操作优先级比“=”要高,这点要记住