- JS的数据类型
在ES5的时候,我们认知的数据类型确实是 6种:Number、String、Boolean、undefined、object、Null。
ES6 中新增了一种 Symbol 。这种类型的对象永不相等,即始创建的时候传入相同的值,可以解决属性名冲突的问题,做为标记。
其中:
基本类型(单类型):除Object。 String、Number、boolean、null、undefined。
引用类型:object。里面包含的 function、Array、Date。 - 数据类型的内存图
栈:是有结构的,每个区块按照一定的次序存放。主要处理各种基本类型,包括null,undefined,boolean,number,string,bigint,以及对象的引用(即指针)。
堆:是没有结构的,数据可以任意存放。主要处理引用类型: 对象、数组、函数等。首先从栈中获得该对象的地址指针,然后在从堆中取得数据。
遇到的一个面试题:const定义的值能修改么?
以平时的经验是不能的,但是平时我们使用const定义的值一般都是基本类型,它们的确不能被修改。但是如果使用const定义一个对象,这个对象的值是可以修改的。本质是什么?原因就是const定义对象的时候,我们说的常量其实就是上图中栈中的指针,就是const对象对应堆内存的指向是不变的,只要指向不变,修改这个对象的属性是可以的。看下面的代码:
const a = 1;
console.log(a);
a = 2;
//console.log(a);修改了a,报错
const obj = {a:1};
obj.a = 2;
console.log(obj);//不报错
-
== 和 ===的区别
== :不管数据类型是否相同,在数据类型的转换后相同即成立
===:如果数据类型不同直接为false -
null 和 undefined 的区别
console.log(typeof (undefined));//undefined
console.log(typeof (null));//object
console.log(undefined == null) //true
console.log(undefined === null) //false
console.log(Number(null));//0
console.log(Number(undefined));//NaN
//if语句中都为false
// null表示一个值被定义了,但是这个值是空值
// undefined表示缺少值,即此处应该有值,但是还没有定义
[阮一峰老师文章有提及](http://www.ruanyifeng.com/blog/2014/03/undefined-vs-null.html)