JS学习系列08 - 内存分配

本文会同步到我的个人网站中。

在ECMAScript中,变量可以存放两种类型的值

  • 原始值
  • 引用类型值

原始值指的是代表原始数据类型的值,例如:undefined null number string boolean

引用类型指的是复合类型值,例如:object function array 自定义对象

堆和栈

  • 栈是一种LIFO的数据结构,即后进先出,队列是一种FIFO的数据结构,即先进先出
  • 堆是基于散列算法存放数据的一种数据结构
  • 原始值是存放在栈中的简单数据段,它们的值直接存储在变量访问的位置,例如:
var num = 10;      //变量名num和初始化值10都存放在栈中

复制代码
  • 引用值是存放在堆中的对象,引用值的变量名是一个存放在栈中指针,指向堆中的引用值对象,例如:
var obj = new object();    //变量名obj存放在栈中,而它指向的object()对象是存放在堆中的

复制代码

为什么原始值要放在栈中,引用值要放在堆中?

  • 先看一段代码
function Person(id,name,age){

this.id = id;

this.name = name;

this.age = age;

}

var num = 10;

var bol = true;

var str = "abc";

var obj = new Object();

var arr = ['a','b','c'];

var person = new Person(100,"笨蛋的座右铭",25);

复制代码
  • 内存分析
  • 原始类型变量num bol str的变量名和内容都存放在栈中
  • 引用类型变量obj arr person的变量名作为指针存放在栈中,指向堆中的变量内容

由上图可以看出,我们不能直接操作堆中的数据,也就是说不能直接操作对象,但我们可以通过栈中存放的变量指针来进行操作

  • 为什么要分堆和栈

堆比栈大,栈比堆的运算速度快,对象是一个复杂的结构,并且可以自由扩展,如:数组可以无限扩充,对象可以自由添加属性。将他们放在堆中是为了不影响栈的效率。而是通过引用的方式查找到堆中的实际对象再进行操作。相对于简单数据类型而言,简单数据类型就比较稳定,并且它只占据很小的内存。不将简单数据类型放在堆是因为通过引用到堆中查找实际对象是要花费时间的,而这个综合成本远大于直接从栈中取得实际值的成本。所以简单数据类型的值直接存放在栈中

总结

  • 两种变量类型:原始值和引用类型值
  • 变量在内存中的存放位置分为堆和栈

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏calmound

sscanf

sscanf与scanf类似,都是用于输入的,只是后者以键盘(stdin)为输入源,前者以固定字符串为输入源。    第一个参数可以是一个或多个 {%[*]...

53960
来自专栏Java Web

Java学习笔记(3)—— String类详解

前言 因为没有成功地为IDEA配上反编译工具,所以自己下载了一个XJad工具,背景是白色的,所以忍着强迫症硬是把IDEA的主体也给换成白色了,感觉为了这篇文章...

28550
来自专栏Java帮帮-微信公众号-技术文章全总结

Java面试系列4

Java面试系列4 一、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 可以。必须只有一个类名与文件名相同。Public的类必须和文件...

36460
来自专栏C/C++基础

野指针

指向非法的内存地址指针叫作野指针(Wild Pointer),也叫悬挂指针(Dangling Pointer),意为无法正常使用的指针。

11810
来自专栏Android相关

Flutter--Dart学习

2011年10月公开。它的开发团队由Google Chrome浏览器V8引擎 (JavaScript引擎)")团队的领导者拉尔斯·巴克主持,目标在于成为下一代结...

35520
来自专栏猿人谷

小瓜牛漫谈 — String

String 类在 Java 中代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。 1 public static voi...

19890
来自专栏逸鹏说道

Python3 与 C# 基础语法对比(Function专栏-新排版)

在线编程:https://mybinder.org/v2/gh/lotapp/BaseCode/master

19330
来自专栏Java架构师历程

精选30道Java笔试题解答

都是一些非常非常基础的题,是我最近参加各大IT公司笔试后靠记忆记下来的,经过整理献给与我一样参加各大IT校园招聘的同学们,纯考Java基础功底,老手们就不用进来...

35840
来自专栏WD学习记录

Python数据结构与算法笔记(2)

栈、队列、deques、列表是一类数据的容器,它们数据项之间的顺序由添加或删除的顺序决定。一旦一个数据项被添加,它相对于前后元素一直保持该位置不变。诸如此类的数...

12210
来自专栏nummy

Iterables vs. Iterables vs. Generators

容器是用来储存元素的一种数据结构,它支持隶属测试,容器将所有数据保存在内存中,在Python中典型的容器有:

7220

扫码关注云+社区

领取腾讯云代金券