手机版

JavaScript基本方法数据类型

时间:2021-09-01 来源:互联网 编辑:宝哥软件园 浏览:

因为我是一个狂野的程序员,刚开始学编程的时候并不关心内存的基础知识,所以提到“栈中存在什么,栈中只存在一个引用”的时候,总是一脸迷惑。

后来,我逐渐学会了一些记忆的知识,这是非常有必要知道的。

基本数据结构

Stack是一种线性表,只允许在段中插入或删除,是一种先进先出的数据结构。

许多

堆是一种基于哈希算法的数据结构。

长队

队列是一种先进先出(FIFO)数据结构。

JavaScript中数据类型的存储

在JavaScript中,数据类型分为基本数据类型和引用数据类型。它们之间的区别之一是存储位置不同。

基本数据类型

我们都知道JavaScript中的基本数据类型有:

字符串数字布尔值未定义的空符号(暂时忽略)基本数据类型是简单的数据段,存储在堆栈内存中。

参考数据类型

JavaScript中的引用数据类型有:

数组对象引用数据类型保存在堆内存中,然后对堆内存中实际对象的引用保存在堆栈内存中。因此,JavaScript中对引用数据类型的操作是对操作对象的引用,而不是对实际对象的引用。

可以理解,地址存储在堆栈存储器中,它与堆栈存储器中的实际值相关。

图表

现在,让我们尝试声明几个变量:

var name=' axuebinvar年龄=25岁;var作业;var arr=[1,2,3];var obj={ age :25 };下图可用于显示数据类型在内存中的存储情况:

此时,名称、年龄和作业这三种基本数据类型直接存储在堆栈内存中,而arr arr、obj只在堆栈内存中存储一个地址来表示对堆内存的引用。

复制

基本数据类型

对于基本数据类型,如果复制,系统会自动给栈内存中的新变量赋一个新值,这很容易理解。

参考数据类型

对于数组和对象等引用数据类型,复制时会有差异:

系统会自动为堆栈内存中的新变量赋值,但这个值只是一个地址。也就是说,复制的变量和原始变量具有相同的地址值,并且指向堆内存中的相同对象。

如图所示,在执行var objCopy=obj之后,obj和objCopy具有相同的地址值,并在堆内存中执行相同的真实对象。

有什么区别?

当我修改obj或objCopy时,它会导致另一个变量发生变化。

为什么呢?

为什么底层数据类型存在于堆栈中,而引用数据类型存在于堆中?

堆比栈大,栈比较快。基本数据类型相对稳定,占用内存相对较少。引用数据类型的大小是动态且无限的。堆内存是无序的,可以通过引用直接获取。参考文章

了解js内存分配

原始值和参考值

在ECMAScript中,变量可以保存两种类型的值,即原始值和引用值。原始值是指表示原始数据类型(基本数据类型)的值,即由undefined、null、number、string和boolean类型表示的值。引用值是指复合数据类型的值,即对象、函数、数组和自定义对象等

堆栈和堆

原值和参考值对应的内存结构有两种,即栈和栈,是一种后进先出的数据结构。在javascript中,堆栈的行为可以通过Array来模拟

原始值是存储在堆栈中的简单数据,也就是说,它们的值直接存储在变量访问的位置。堆是一种基于哈希算法的数据结构。在javascript中,引用值存储在堆中。引用值是存储在堆中的对象,即存储在变量处的值(即指向对象并存储在堆栈中的变量)是指向存储在堆中的实际对象的指针。

示例:var obj=new Object();Obj存储在堆栈中,并指向存储在堆中的对象new Object()。那为什么要把引用值放在堆里,而把原值放在栈里,而不是全部放在内存里,为什么不把它们放在一起呢?然后,让我们来探索这个问题的答案!首先,让我们看看代码:

函数Person(id,姓名,年龄){ this.id=idthis.name=namethis.age=年龄;} var num=10var bol=truevar str=' abcvar obj=新对象();var arr=['a ',' b ',' c '];Var person=new Person(100,‘白痴的座右铭’,25);然后让我们看看内存分析图:

变量num、BOL和str是基本数据类型,它们的值直接存储在堆栈中;obj、person、arr arr是复合数据类型,它们的引用变量存储在堆栈中,并指向存储在堆栈中的实际对象。

从上图可以看出,我们不能直接操作栈中的数据,也就是说我们不能直接操作对象,但是我们可以通过栈中对象的引用来操作对象,就像我们通过遥控器操作电视一样,不同的是电视本身没有控制按钮。

现在让我们来回答为什么引用值应该放在堆中,而原始值应该放在堆栈中的问题:

记住一句话:能量是平衡的,无非是时间换空间,空间换时间

堆比栈大,栈比堆快。对象是一个复杂的结构,可以自由扩展。例如,数组可以无限扩展,对象可以自由添加属性。它们被放在堆中,以免影响堆栈的效率。相反,在操作之前,通过引用找到堆中的实际对象。与简单数据类型相比,简单数据类型更稳定,并且只占用少量内存。简单数据类型不放在堆中的原因是,通过在堆中引用它们来找到实际对象需要时间,综合成本远远大于直接从堆栈中获取实际值的成本。所以简单数据类型的值直接存储在堆栈上。

版权声明:JavaScript基本方法数据类型是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。