对内存空间的理解

1.w3c中对内存空间的解释:

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

  原始值
存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置。
  引用值
存储在堆(heap)中的对象,也就是说,存储在变量处的值是一个指针(point),指向存储对象的内存处。

  为变量赋值时,ECMAScript 的解释程序必须判断该值是原始类型,还是引用类型。要实现这一点,解释程序则需尝试判断该值是否为 ECMAScript 的原始类型之一,即 Undefined、Null、Boolean、Number 和 String 型。由于这些原始类型占据的空间是固定的,所以可将他们存储在较小的内存区域 - 栈中。这样存储便于迅速查寻变量的值。

  如果一个值是引用类型的,那么它的存储空间将从堆中分配。由于引用值的大小会改变,所以不能把它放在栈中,否则会降低变量查寻的速度。相反,放在变量的栈空间中的值是该对象存储在堆中的地址。地址的大小是固定的,所以把它存储在栈中对变量性能无任何负面影响。

2.对于alert(typeof null)被ECMAScript解析为object的说明:(沿用w3c上的解释)

  为什么 typeof 运算符对于 null 值会返回 "Object"。这实际上是 JavaScript 最初实现中的一个错误,然后被 ECMAScript 沿用了。现在,null 被认为是对象的占位符,从而解释了这一矛盾,但从技术上来说,它仍然是原始值。

  null:对象的占位符;

  undefined:声明了变量但未对其初始化时赋予该变量的值;

  且alert(null == undefined);弹出值为true;

3.NaN:

  1)NaN == NaN与 NaN === NaN返回的都是false;即NaN不等于它本身;

  2)一般不直接使用NaN,而是函数isNaN();

n. 创建内存空间的情况:定义一个对象名(引用类型),指向一片内存空间。

  当var a = {n:1};时,a就指向一片内存空间,我们可以把它称为inMemoryObject

  示意图:

      a--|

         |————>>inMemoryObject {

                n:1

              }

  当发生var b = a;时,b也指向了这片内存空间。

  示意图:

    a--|

    b--|

      |————>>inMemoryObject {

              n:1

            }

  此时,若发生var a.x = a = {n:2};

  这里涉及到变量的赋值与表达式的解析的顺序问题;

  变量的赋值顺序:右>>——>>左;  变量名 = 值;

  表达式的解析顺序:左>>——>>右;  变量名1 = 变量名2;

时间: 2024-12-28 20:31:02

对内存空间的理解的相关文章

关于内存地址和内存空间的理解。

1.内存地址用4位16进制和8位16进制表示的区别.例如经常可以看到某些书籍上写的内存地址0x0001,在另外一些书籍上写的内存地址又变成了0x00000001.都是表示的编号为1的内存地址,为什么一个是4位16进制表示,另外一个又是用8位16进制表示呢? 首先,必须要知道内存地址只是一个编号,代表一个内存空间.那么这个空间是多大呢?原来在计算机中存储器的容量是以字节为基本单位的.也就是说一个内存地址代表一个字节(8bit)的存储空间. 例如经常说32位的操作系统最多支持4GB的内存空间,也就是

java内存区域——深入理解JVM读书笔记

本内容由<深入理解java虚拟机>的部分读书笔记整理而成,本读者计划连载. 通过如下图和文字介绍来了解几个运行时数据区的概念. 方法区:它是各个线程共享的区域,用于内存已被VM加载的类信息.常量.静态变量.即时编译器编译的代码等数据.JVM规范对这个区域的限制很宽松,如同堆一样不需要连续的内存.可选择固定大小.可扩展的大小外,还可以选择不实现垃圾收集.因为在些区域的垃圾收集必要性不高且效果较差.如果回收也是常量池的回收和类型的卸载,但此操作异常困难.当方法区无法满足内存的分配时,抛OutOfM

Linux内存点滴:用户进程内存空间

原文出处:PerfGeeks 经常使用top命令了解进程信息,其中包括内存方面的信息.命令top帮助文档是这么解释各个字段的.VIRT , Virtual Image (kb)RES, Resident size (kb)SHR, Shared Mem size (kb)%MEM, Memory usage(kb)SWAP, Swapped size (kb)CODE, Code size (kb)DATA, Data+Stack size (kb)nFLT, Page Fault countn

Java内存泄露的理解与解决

Java内存管理机制 在C++语言中,如果需要动态分配一块内存,程序员需要负责这块内存的整个生命周期.从申请分配.到使用.再到最后的释放.这样的过程非常灵活,但是却十分繁琐,程序员很容易由于疏忽而忘记释放内存,从而导致内存的泄露.Java语言对内存管理做了自己的优化,这就是垃圾回收机制.Java的几乎所有内存对象都是在堆内存上分配(基本数据类型除外),然后由GC(garbage collection)负责自动回收不再使用的内存. 上面是Java内存管理机制的基本情况.但是如果仅仅理解到这里,我们

汇编语言 使用内存空间

汇编语言 使用内存空间 在上一个实验我们已经知道,c语言使用寄存器需要我们给出相应寄存器的名称,在函数执行过程中就能一一对应. 下面,我们来研究c语言如何使用内存空间: 我们已经知道像偏移地址2000h中写入一个字节的内容,我们用如下方法: *(char *)0x2000='a'; 像2000:0写入一个字节用如下方法: *(char far *)0x20000000='a'; 有了上面两点知识下面进行试验: 1.编写一个程序um1.c 编译.链接生成.exe文件,然后用debug加载,对mai

王爽-汇编语言-综合研究三-使用内存空间

(一) 研究概述 数据不仅可以存储在寄存器中,还可以存储在内存中.这次我们就研究在C语言中,怎样直接在内存中存储数据.以及这样做的一些延伸问题.另外,在附录研究中,我们还探究了C语言中循环和分支结构的实现. (二) 研究过程 1) 直接在C语言中使用内存空间 此处援引书中的话: 对于存储空间来说,要使用他们一般都需要给出两个信息:一是指明存储空间所在.是哪个的信息:二是指明存储空间有多大的类型信息. 对于寄存器来说,就需要给出寄存器的名称,寄存器的名称就也包含了他们的类型信息. 对于内存空间来说

Redis 小白指南(三)- 事务、过期、消息通知、管道和优化内存空间

Redis 小白指南(三)- 事务.过期.消息通知.管道和优化内存空间 简介 <Redis 小白指南(一)- 简介.安装.GUI 和 C# 驱动介绍> 讲的是 Redis 的介绍,以及如何在 Windows 上安装并使用,一些 GUI 工具和自己简单封装的 RedisHelper. <Redis 小白指南(二)- 聊聊五大类型:字符串.散列.列表.集合和有序集合>讲的是 Redis 中最核心的内容,最常用的就是和数据类型打交道. 目录 事务 过期时间 消息通知 管道 优化内存空间

前端基础进阶(一):内存空间详细图解

变量对象与堆内存 var a = 20; var b = 'abc'; var c = true; var d = { m: 20 } 因为JavaScript具有自动垃圾回收机制,所以对于前端开发来说,内存空间并不是一个经常被提及的概念,很容易被大家忽视.特别是很多不是计算机专业的朋友在进入到前端之后,会对内存空间的认知比较模糊,甚至有些人干脆就是一无所知. 当然也包括我自己.在很长一段时间里认为内存空间的概念在JS的学习中并不是那么重要.可是后我当我回过头来重新整理JS基础时,发现由于对它们

C语言内存空间的使用--数组

1,数组的定义 数组可以理解一块有控件的内存地址,和指针相识,但指针是可变,数组是一个常量符号,指定了那块地址. 1>定义一个空间: 1.大小 2.读取方式 int buf[100];//控件是0~99 2> 数组名是一个常量符号,而指针是个变量,一定不要放到=的左边     char buf[100];     buf = "hello world";   //将会报错 3>数组名[m]  m 的作用域是在申请的时候,当你后面使用的时候,m可大可小,编译器无法识别判