js六种数据类型是怎么样存储的?

本文深入解析JavaScript中的数据存储机制,区分基本数据类型与引用数据类型的存储位置及其影响。通过实例说明不同类型在内存中的表现形式及复制行为的区别。

一个很基础的知识点,JavaScript中基本数据类型和引用数据类型是如何存储的。

由于自己是野生程序员,在刚开始学习程序设计的时候没有在意内存这些基础知识,导致后来在提到“什么什么是存在栈中的,栈中只是存了一个引用”这样的话时总是一脸懵逼。。

后来渐渐的了解了一些内存的知识,这部分还是非常有必要了解的。

基本数据结构

栈,只允许在一段进行插入或者删除操作的线性表,是一种先进后出的数据结构。

堆是基于散列算法的数据结构。

队列

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

JavaScript中数据类型的存储

JavaScript中将数据类型分为基本数据类型和引用数据类型,它们其中有一个区别就是存储的位置不同。

基本数据类型

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

  • String
  • Number
  • Boolean
  • Undefined
  • Null
  • Symbol(暂时不管)

基本数据类型都是一些简单的数据段,它们是存储在栈内存中。

引用数据类型

JavaScript中的引用数据类型有:

  • Array
  • Object

引用数据类型是保存在堆内存中的,然后再栈内存中保存一个对堆内存中实际对象的引用。所以,JavaScript中对引用数据类型的操作都是操作对象的引用而不是实际的对象。

可以理解为,栈内存中保存了一个地址,这个地址和堆内存中的实际值是相关的。

图解

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

?

1

2

3

4

5

var name="axuebin";

var age=25;

var job;

var arr=[1,2,3];

var obj={age:25};

 

可以通过下图来表示数据类型在内存中的存储情况:

此时 name , age , job 三种基本数据类型是直接存在栈内存中的,而 arr , obj 在栈内存中只是存了一个地址来表示对堆内存中的引用。

复制

基本数据类型

对于基本数据类型,如果进行复制,系统会自动为新的变量在栈内存中分配一个新值,很容易理解。

引用数据类型

如果对于数组、对象这样的引用数据类型而言,复制的时候就会有所区别了:

系统也会自动为新的变量在栈内存中分配一个值,但这个值仅仅是一个地址。也就是说,复制出来的变量和原有的变量具有相同的地址值,指向堆内存中的同一个对象。

如果所示,执行了 var objCopy=obj 之后, obj 和 objCopy 具有相同的地址值,执行堆内存中的同一个实际对象。

这有什么不同呢?

当我修改 obj 或 objCopy 时,都会引起另一个变量的改变。

为什么?

为什么基础数据类型存在栈中,而引用数据类型存在堆中呢?

  1. 堆比栈大,栈比对速度快。
  2. 基础数据类型比较稳定,而且相对来说占用的内存小。
  3. 引用数据类型大小是动态的,而且是无限的。
  4. 堆内存是无序存储,可以根据引用直接获取。

总结

以上所述是小编给大家介绍的JavaScript数据类型的存储方法详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

您可能感兴趣的文章:

原文链接:http://www.cnblogs.com/gdsblog/archive/2017/08/24/7425917.html

<think>好的,我需要回答用户关于JavaScript中引用数据类型的定义及种类的问题。首先,我要回忆相关的知识,确保准确无误。 根据用户提供的引用内容,特别是引用[1]和引用[4],引用数据类型在JavaScript中主要是指对象类型(object)。基本数据类型是不可变的,而引用数据类型是可变的,存储的是对象的引用,而不是实际的值。 接下来要确定种类。常见的引用数据类型包括对象(Object)、数组(Array)、函数(Function),还有日期(Date)、正则表达式(RegExp)等。不过,用户提供的引用中只明确提到对象类型是复杂数据类型,其他如数组和函数可能属于对象的子类型。 需要确认这些是否都属于引用数据类型。例如,数组在JS中实际上是对象的一种特殊形式,函数也是对象。因此,引用数据类型的主要种类是Object,以及它的衍生类型如Array、Function、Date等。但根据引用内容,用户提供的资料里可能只提到Object作为复杂数据类型,所以需要根据引用来回答,避免超出范围。 同时要注意引用[4]提到除Object外其他类型不可变,所以引用类型只有Object,但它的子类如数组、函数等都属于Object类型。因此,在种类部分需要说明对象类型包括哪些具体形式,比如普通对象、数组、函数等。 最后,确保回答结构清晰,分点说明定义和种类,并正确引用资料中的内容,添加引用标识。</think>### JavaScript 引用数据类型的定义及种类 #### 1. 定义 **引用数据类型**是 JavaScript 中用于表示复杂结构的数据类型,其核心特征是值存储在内存中的对象,变量实际保存的是指向对象内存地址的引用(即指针)。这类数据类型的值是可变的(例如对象的属性可以被修改),且在赋值或传递时复制的是引用而非实际值[^1][^4]。 #### 2. 种类 JavaScript 中引用数据类型主要包括以下类别: 1. **对象(Object)** - **普通对象**:以键值对形式存储数据,例如: ```javascript let person = { name: "Alice", age: 30 }; ``` - **内置对象**:如数组(Array)、函数(Function)、日期(Date)、正则表达式(RegExp)等。 - **数组**:本质是特殊的对象,用于存储有序数据: ```javascript let numbers = [1, 2, 3]; ``` - **函数**:可执行的对象,例如: ```javascript function greet() { console.log("Hello!"); } ``` - **其他对象**:如 `Map`、`Set`、`Promise`(ES6+ 新增)等。 2. **特殊引用类型** - 某些语言特性(如原型链)衍生的对象类型,例如: - 通过构造函数创建的对象(如 `new Date()`)。 - 包装对象(如 `new String("text")`,但一般推荐直接使用基本类型字符串)。 #### 3. 引用类型的核心特性 - **可变性**:对象属性或数组元素可以直接修改,例如: ```javascript let arr = [1]; arr.push(2); // 修改原数组 ``` - **引用传递**:变量赋值或函数传参时传递的是内存地址,而非值的副本: ```javascript let obj1 = { a: 1 }; let obj2 = obj1; // obj2 和 obj1 指向同一对象 obj2.a = 2; // 修改会影响 obj1 ``` #### 4. 与基本数据类型的区别 | **特性** | 基本数据类型(如 `number`) | 引用数据类型(如 `object`) | |----------------|----------------------------|---------------------------| | **存储方式** | 直接存储值 | 存储内存地址的引用 | | **可变性** | 不可变 | 可变 | | **比较规则** | 比较值是否相等 | 比较引用是否指向同一地址 | 例如: ```javascript 5 === 5; // true {} === {}; // false(不同内存地址) ``` ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值