面试题-null存在栈还是堆中

537 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

我们都知道js存储在内存中,会存在栈或堆中,栈中存放简单数据类型(基本数据类型),堆中复杂数据类型(引用数据类型),也就是对象。但是null属于简单数据类型,它却不存在栈中

首先先来了解一下堆和栈,什么是堆,什么是栈?

  1. 栈:是一种特殊的列表,栈内的元素只能通过列表的一端访问,先进后出的数据结构,栈会由操作系统自动分配内存空间,自动释放,存储的是基础变量以及一些对象的引用变量,占据固定大小的空间。
  2. 堆:是一种经过排序的树形数据结构,每个结点都有一个值,且堆的存取是随意。堆由操作系统动态分配的内存,大小不定也不会自动释放,一般由程序员分配释放,也可由垃圾回收机制回收。

js数据类型包括简单数据类型和复杂数据类型。

基本数据类型共有6种:

  1. String
  2. Number
  3. Boolean
  4. null
  5. undefined
  6. Symbol

复杂数据类型

Array,Function,Object等,除了基本数据类型,都是引用数据类型。

js在堆和栈中是怎么存储的?

image.png

为什么null会存储在堆中?

MDN:null 是表示缺少的标识,指示变量未指向任何对象。把 null 作为尚未创建的对象,也许更好理解。在 API 中,null 常在返回类型应是一个对象,但没有关联的值的地方使用。

也就是说null是一个对象类型,所以存储在堆中。

可以通过typeof判断null的类型。 image.png

null 与 undefined 有什么不同

typeof null        // "object" (因为一些以前的原因而不是'null')
typeof undefined   // "undefined"
null === undefined // false
null  == undefined // true
null === null // true
null == null // true
!null //true
isNaN(1 + null) // false
isNaN(1 + undefined) // true
1 + null  //1
1+undefined // NaN