美文网首页
理解Javascript_01_理解内存分配

理解Javascript_01_理解内存分配

作者: 不止风雨 | 来源:发表于2017-12-09 10:56 被阅读0次

在正式开始之前,我想先说两句,理解javascript系列博文是通过带领大家分析javascript执行时的内存分配情况,来解释javascript原理,具体会涵盖javascript预加载,闭包原理,面象对象,执行模型,对象模型...,文章的视角很特别,也非常深入,希望大家能接受这种形式,并提供宝贵意见。

原始值和引用值

在ECMAScript中,变量可以存放两种类型的值,即原始值和引用值。

原始值指的就是代表原始数据类型(基本数据类型)的值,即Undefined,Null,Number,String,Boolean类型所表示的值。

引用值指的就是复合数据类型的值,即Object,Function,Array,以及自定义对象,等等

栈和堆

与原始值与引用值对应存在两种结构的内存即栈和堆

栈是一种后进先出的数据结构,在javascript中可以通过Array来模拟栈的行为

vararr = [];//创建一个栈

arr.push("apple");//压入元素"apple" ["apple"]

arr.push("orange");//压入元素"orange"   ["apple","orange"]

arr.pop();//弹出"orange"      ["apple"]

arr.push("banana");//压入元素"banana"   ["apple","banana"]

我们来看一下,与之对应的内存图:

原始值是存储在栈中的简单数据段,也就是说,他们的值直接存储在变量访问的位置。

堆是存放数据的基于散列算法的数据结构,在javascript中,引用值是存放在堆中的。

引用值是存储在堆中的对象,也就是说,存储在变量处的值(即指向对象的变量,存储在栈中)是一个指针,指向存储在堆中的实际对象.

例:var obj = new Object(); obj存储在栈中它指向于new Object()这个对象,而new Object()是存放在堆中的。

那为什么引用值要放在堆中,而原始值要放在栈中,不都是在内存中吗,为什么不放在一起呢?那接下来,让我们来探索问题的答案!

首先,我们来看一下代码:

functionPerson(id,name,age){

this.id = id;

this.name = name;

this.age = age;

}

varnum = 10;

varbol =true;

varstr ="abc";

varobj =newObject();

vararr = ['a','b','c'];

varperson =newPerson(100,"笨蛋的座右铭",25);

然后我们来看一下内存分析图:

变量num,bol,str为基本数据类型,它们的值,直接存放在栈中,obj,person,arr为复合数据类型,他们的引用变量存储在栈中,指向于存储在堆中的实际对象。

由上图可知,我们无法直接操纵堆中的数据,也就是说我们无法直接操纵对象,但我们可以通过栈中对对象的引用来操作对象,就像我们通过遥控机操作电视机一样,区别在于这个电视机本身并没有控制按钮。

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

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

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

总结:

程序很简单,但它是一切的根本,基础是最重要的,因为摩天大厦也是一块砖一块瓦的搭建起来的。

内存是程序执行的根本,搞懂了内存,就等于搞懂了一切。

心血之作,鼓励一下自已,加油!

参考:

JavaScript高级程序设计

相关文章

  • 理解Javascript_01_理解内存分配

    在正式开始之前,我想先说两句,理解javascript系列博文是通过带领大家分析javascript执行时的内存分...

  • JVM内存分配理解

    JVM进程内存疑惑 一段时间,老是收到服务器内存不够用的告警(运维设置的可用内存低于90%即告警),登录服务器查看...

  • (WWDC) 理解 Swift 性能

    理解如何实现才能更好地去理解性能 内容概览 内存分配 引用计数 方法分发 协议类型 泛型代码 总结 内存分配 在栈...

  • 深入理解内存分配

    相信大家在学习C语言的时候,malloc是最早遇到的几个方法之一,这里就来深入的了解下,macOS/iOS中用户空...

  • Java的内存分配理解

    本篇文章为本人学习笔记,如有错误,希望指正。 Java 程序在运行时,需要在内存中分配空间。为了提高运算效率,就对...

  • C语言中手把手教你动态内存分配

    C语言中手把手教你动态内存分配 动态内存分配 常见的内存分配的错误 先上一个内存分配的思维导图:便于联想想象,理解...

  • jvm2:Java内存溢出

    内存泄露和内存溢出的区别 内存溢出通俗理解就是内存不够了,不能分配足够大的内存。内存泄露就是程序中已动态分配的堆内...

  • 那个小白还没搞懂内存溢出,只能用案例说给他听了

    内存溢出,通俗的理解,就是你要求分配的内存超出了JVM能给你的,JVM不能满足需求,于是产生溢出。为了便于理解,本...

  • 深入JVM内核11 JVM内存分配

    理解JVM内存分配策略 JVM分配内存机制有三大原则和担保机制具体如下所示: 优先分配到eden区 大对象,直接进...

  • 基于Java 的内存分析

    在J2SE中,通过进行内存分析,可以让我们更好的理解程序在内存中的内存分配问题,也能让我们更好的理解我们的代码...

网友评论

      本文标题:理解Javascript_01_理解内存分配

      本文链接:https://www.haomeiwen.com/subject/udeuixtx.html