第28题:JavaScript内存机制 —— 数据是如何存储的

js内存生命周期

  • 定义变量时就完成了内存分配
  • 使用值的过程是对分配内存进行读和写的操作
  • 内存释放依赖于垃圾回收器

栈和堆

运行程序时,需要内存空间存放数据。一般来说,系统会划分两种不同的内存空间:栈(stack)和 堆(heap)。

栈:是有结构的,每个区块按照一定的次序存放。主要处理各种基本类型,包括null,undefined,boolean,number,string,bigint,以及对象的引用(即指针)。

堆:是没有结构的,数据可以任意存放。主要处理引用类型: 对象、数组、函数等。首先从栈中获得该对象的地址指针,然后在从堆中取得数据。
第28题:JavaScript内存机制 —— 数据是如何存储的_第1张图片
看一个面试题:const定义的值能修改么?

以平时的经验是不能的,但是平时我们使用const定义的值一般都是基本类型,它们的确不能被修改。但是如果使用const定义一个对象,这个对象的值是可以修改的。本质是什么?原因就是const定义对象的时候,我们说的常量其实就是上图中栈中的指针,就是const对象对应堆内存的指向是不变的,只要指向不变,修改这个对象的属性是可以的。看下面的代码:

 const a = 1;
    console.log(a);
    // 修改a,报错
    //a = 2;
    //console.log(a);
    const obj = {a:1};
    obj.a = 2;
    console.log(obj);
    // 修改obj的指向,报错
    obj =  {};
    console.log(obj);

在这里插入图片描述

在这里插入图片描述
下面这张图更好的解释了上面的代码:
第28题:JavaScript内存机制 —— 数据是如何存储的_第2张图片
只要const定义对象的指向不变,修改对象的属性时可以的。

你可能感兴趣的:(前端面试题汇总)