JS中变量的存储问题(面试准备)

news/2024/7/19 13:21:55 标签: 数据结构, js

js中变量分为两种类型基本数据类型和引用类型">JS中变量分为两种类型:基本数据类型和引用类型

(一)基本数据类型:Undefined,Null,Boolean,Number和String
(二)引用类型:对象,数组,函数
原始值和引用值存储在内存中的位置分别是栈和堆。原始值是存储在栈中的简单数据段,他们的值直接存储在变量访问的位置。引用值是存储在堆中的对象。

栈:

主要表现为一种数据结构,是只能在某一端插入和删除的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读取数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。
栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一段成为栈顶,另一端称为栈底;栈底固定,而栈顶浮动 ;栈中元素个数为零时,称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为后进先出表。
图谱解释:

存储在栈中的值是一个指针,指向存储在堆中的实际对象
关于基本变量的交换,按值访问操作的是他们实际保存的值;

js javascript"> js-function">js-keyword">function js-title">qkjs-params">()
 {
   js-keyword">var store1 = js-string">"China";
   js-keyword">var store2 = store2;
   store1 = js-string">"USA";
   alert(store2);js-comment">//China

 }
 qk();

将基本类型store1传递给另一个变量(赋值)时,其实是分配了一块新的内存空间,因此改变了store1的值对store2没有任何影响。

堆:

在程序中,堆用于动态分配和释放程序所使用的对象。在以下情况中调用堆操作:

    1.事先不知道程序所需对象的数量和大小。

    2.对象太大,不适合使用堆栈分配器。

  堆使用运行期间分配给代码和堆栈以外的部分内存。

  在javascript中,引用数据是放在堆中的,例如数组和对象,因为在javascript中,一切都是对象,对象可以进行扩展,放置在堆中可以进行不断的扩展,如果放在内存中就会消耗大量资源。放置在堆中的数据的查询效率比较低。这也是内存优于堆的好处,但是内存的存储空间要比堆的小很多。
  按引用访问,当查询时,需要先从栈中读取内存地址,然后再顺藤摸瓜找到保存在堆内存中的值
  
var obj1 = new Object();
obj1.name = "obji name";
console.log(obj1.name);//输出obj1 name
var obj2 = obj1;
console.log(obj2.name);//输出obj1 name
obj1.name = "qk";
console.log(obj2.name);//qk
  

  
  栈的优势就是存取速度比堆要快,仅次于直接位于CPU中的寄存器,但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,垃圾收集器会自动地收走这些不再使用的数据,但是缺点是由于在运行时动态分配内存,所以存取速度较慢。

所以相对于简单数据类型而言,他们占用内存比较小,如果放在堆中,查找会浪费很多时间,而把堆中的数据放入栈中也会影响栈的效率。比如对象和数组是可以无限拓展的,正好放在可以动态分配大小的堆中。


http://www.niftyadmin.cn/n/611733.html

相关文章

log2 c语言不用循环,试过不用循环语句撸代码吗?

译者按: 通过使用数组的reduce、filter以及map方法来避免循环语句。为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,翻译仅用于学习。在前一篇博客,我们介绍了,如果不使用if语句的话&…

浏览器的本地存储与服务器端存储

数据既可以在浏览器本地存储,也可以在服务器端存储 浏览器端可以保存一些数据,需要的时候直接从本地获取,sessionStorage,localStorage和cookie都是由浏览器存储在本地的数据 服务器端也可以保存所有用户的数据,但需要的时候浏览…

C语言程序中紧急情况,《C语言及程序设计》实践参考——紧急救援

《C语言及程序设计》实践参考——紧急救援《C语言及程序设计》实践参考——紧急救援返回:贺老师课程教学链接【项目7-紧急救援】洪水突降,人们被困在各个屋顶上。如图所示:救生船每次将从大本营出发,救了人之后将人送回大本营。已…

Java学习路径(二)书籍篇

学习一门新的知识,不可能指望只看一本,或者两本书就能够完全掌握。需要有一个循序渐进的阅读过程。我推荐Oreilly出版的Java系列书籍。 在这里我只想补充一点看法,很多人学习Java是从《Thinking in Java》这本书入手的,但是我认为…

C语言课程设计个人所得税计算,请个高手帮忙设计个C语言个人所得税计算的程序...

匿名用户1级2011-12-15 回答#include #define TAXBASE 2000typedef struct{long base;long limit;double taxrate;}TAXTABLE;TAXTABLE TaxTable[] {\{0, 500, 0.05},\{500, 2000, 0.10},\{2000, 5000, 0.15},\{5000, 20000, 0.20},\{20000, 40000, 0.25},\{40000, 60000, 0.30…

4*4矩阵键盘c语言,基于51单片机的4*4矩阵键盘字符输入

描述使用4*4的矩阵键盘和一个数码管在4*4的矩阵键盘上编码0-F的字符,和一个数码管显示每个键盘上输入的字符。//4*4键盘检测程序,按下键后相应的代码显示在数码管上#includetypedef unsigned char UINT8;UINT8 i100;UINT8 j,k,temp,key;void delay(unsigned char i)…

JS 中的prototype

跟着博客园和CSDN上的各位前辈学习啦 Javascript中的对象就是一个指向prototype 的指针 和一个自身属性的列表。javascript创建对象时采用了写时复制的理念。只有构造器才具有prototype属性,原型链继承就是创建一个新的指针,指向构造器的prototype属性。…

c语言 引用头文件夹,在C头文件(.h)中定义自引用结构?

我正在尝试创建一个在两个.c源文件中使用的结构来创建一个简单的链表结构.我认为这将节省在头文件中创建结构的时间,但是,我得到’错误之前的’解析错误’.这是我正在使用的代码:/** Structures.h** Created on: Dec 17, 2011* Author: timgreene*/#ifndef STRUCTUR…