js的栈与堆

JavaScript中基本数据类型和引用数据类型的区别

 这是我引用别人的  觉得很好  

1、基本数据类型和引用数据类型

  ECMAScript包括两个不同类型的值:基本数据类型和引用数据类型。

  基本数据类型指的是简单的数据段,引用数据类型指的是有多个值构成的对象。

  当我们把变量赋值给一个变量时,解析器首先要确认的就是这个值是基本类型值还是引用类型值。

2、常见的基本数据类型:

  Number、String 、Boolean、Null和Undefined。基本数据类型是按值访问的,因为可以直接操作保存在变量中的实际值。示例:

  var a = 10;

  var b = a;

  b = 20;

  console.log(a); // 10值

  上面,b获取的是a值得一份拷贝,虽然,两个变量的值相等,但是两个变量保存了两个不同的基本数据类型值。

  b只是保存了a复制的一个副本。所以,b的改变,对a没有影响。

  下图演示了这种基本数据类型赋值的过程:

     

3、引用类型数据:

  也就是对象类型Object type,比如:Object 、Array 、Function 、Data等。

  javascript的引用数据类型是保存在堆内存中的对象。

  与其他语言的不同是,你不可以直接访问堆内存空间中的位置和操作堆内存空间。只能操作对象在栈内存中的引用地址。

  所以,引用类型数据在栈内存中保存的实际上是对象在堆内存中的引用地址。通过这个引用地址可以快速查找到保存中堆内存中的对象。

  var obj1 = new Object();

  var obj2 = obj1;

  obj2.name = "我有名字了";

  console.log(obj1.name); // 我有名字了

  说明这两个引用数据类型指向了同一个堆内存对象。obj1赋值给onj2,实际上这个堆内存对象在栈内存的引用地址复制了一份给了obj2,

  但是实际上他们共同指向了同一个堆内存对象。实际上改变的是堆内存对象。

  下面我们来演示这个引用数据类型赋值过程:

    

4、总结区别

  a 声明变量时不同的内存分配: 

  1)原始值:存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置

    这是因为这些原始类型占据的空间是固定的,所以可将他们存储在较小的内存区域 – 栈中。这样存储便于迅速查寻变量的值。

  2)引用值:存储在堆(heap)中的对象,也就是说,存储在变量处的值是一个指针(point),指向存储对象的内存地址。

     这是因为:引用值的大小会改变,所以不能把它放在栈中,否则会降低变量查寻的速度。相反,放在变量的栈空间中的值是该对象存储在堆中的地址。

     地址的大小是固定的,所以把它存储在栈中对变量性能无任何负面影响。

  b 不同的内存分配机制也带来了不同的访问机制
   
  1)在javascript中是不允许直接访问保存在堆内存中的对象的,所以在访问一个对象时,
    首先得到的是这个对象在堆内存中的地址,然后再按照这个地址去获得这个对象中的值,这就是传说中的按引用访问
  2)而原始类型的值则是可以直接访问到的。
  
  c 复制变量时的不同
  
  1)原始值:在将一个保存着原始值的变量复制给另一个变量时,会将原始值的副本赋值给新变量,此后这两个变量是完全独立的,他们只是拥有相同的value而已。
  2)引用值:在将一个保存着对象内存地址的变量复制给另一个变量时,会把这个内存地址赋值给新变量,
    也就是说这两个变量都指向了堆内存中的同一个对象,他们中任何一个作出的改变都会反映在另一个身上。
    (这里要理解的一点就是,复制对象时并不会在堆内存中新生成一个一模一样的对象,只是多了一个保存指向这个对象指针的变量罢了)。多了一个指针
 
  d 参数传递的不同(把实参复制给形参的过程
  
  首先我们应该明确一点:ECMAScript中所有函数的参数都是按值来传递的。
  但是为什么涉及到原始类型与引用类型的值时仍然有区别呢?还不就是因为内存分配时的差别。  
  1)原始值:只是把变量里的值传递给参数,之后参数和这个变量互不影响。
  2)引用值:对象变量它里面的值是这个对象在堆内存中的内存地址,这一点你要时刻铭记在心!
    因此它传递的值也就是这个内存地址,这也就是为什么函数内部对这个参数的修改会体现在外部的原因了,因为它们都指向同一个对象。

更多专业前端知识,请上 【猿2048】www.mk2048.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/363732.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

休眠调试–查找查询的来源

Hibernate为什么在程序的哪个部分以及在哪个部分中生成给定的SQL查询并不总是立即的,尤其是当我们处理的是我们自己编写的代码时。 这篇文章将介绍如何配置Hibernate查询日志记录,并将其与其他技巧一起使用,以找出在程序中执行给定查询的原因…

Java各种对象(PO,BO,VO,DTO,POJO,DAO,Entity,JavaBean,JavaBeans)的区分

PO:持久对象 (persistent object),po(persistent object)就是在Object/Relation Mapping框架中的Entity,po的每个属性基本上都对应数据库表里面的某个字段。完全是一个符合Java Bean规范的纯Java对象,没有增加别的属性和方法。持久…

REMBER

第一句如果我们之间有1000步的距离 你只要跨出第1步我就会朝你的方向走其余的999步 第二句通常愿意留下来跟你争吵的人 才是真正爱你的人第三句付出真心 才会得到真心 却也可能伤得彻底保持距离 就能保护自己 却也注定永远寂寞第四句有时候 不是对方不在乎你 而是你把对…

android 获取程序,Android获取桌面应用程序

转载请注明出处,谢谢:http://blog.csdn.net/harryweasley/article/details/50057029首先在看这个博客之前, 你可以先看下这个博客,http://blog.csdn.net/harryweasley/article/details/50057707里面介绍了两种方式来获取应用程序的…

等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规

随着等保 2.0 时代的到来,网络安全要求更加严格,应用场景更加丰富,等级保护已成为互联网企业义不容辞的责任。作为国内移动安全领域的技术创新企业,几维安全在积极响应等保2.0时代的战略布局,推出等保2.0检测、等保加固…

js中什么是对象,对象的概念是什么?

我们一直在用对象 可是你真的理解对象吗,js中有一个说法是一切皆对象,其实这里说的应该是 一切皆可看作对象 对象就是可以拥有属性和方法的一个集合 士兵就是一个对象,它拥有身高体重的属性,保家卫国,吃饭睡觉的动作方…

在Spring启动时与mongodb一起摇摆

我是Spring Boot的粉丝&#xff0c;这是Spring Boot上的mongodb示例项目。 大多数mongodb示例项目是如此基础&#xff0c;以至于您不会太过分。 您可以搜索普通的Spring Data示例&#xff0c;但是它们可能比您想要的复杂得多。 所以这是我的。 这是我要使用的pom。 <!--?…

android git上传出现错误,热更新上传patch包时提示上传失败,文件不合法

集成配置信息classpath com.android.tools.build:gradle:3.3.2classpath "com.tencent.bugly:tinker-support:1.1.5"distributionUrlhttps://services.gradle.org/distributions/gradle-5.0-all.zipapi com.tencent.bugly:crashreport_upgrade:1.3.6api com.tencent.…

第一章笔记(chapter 1 note

犯错对编程而言非常有教育性. 早期犯的错误越多, 学到的东西就越多.编辑器是提供了编写, 管理, 开发与测试程序的环境, 有时也称为集成开发环境(Integrated Development Environment, IDE).任何环境及任何语言中, 开发程序的编辑, 编译, 链接与执行这四个步骤都是一样的.犯错乃…

又做了3个极品菜[图]

今天的是&#xff1a; 极品豆角炒鸡蛋 极品黄瓜炒鸡蛋 极品炒菠菜没鸡蛋 其他我做的菜请看 《我做的菜很香很好吃[有图]》 转载于:https://www.cnblogs.com/zjneter/archive/2008/04/13/1151383.html

生成器与迭代器

生成器与迭代器一、生成器 1.列表推导式 列表推导式是Python内置的非常简单且强大的可以用来轻松创建列表的方法。它可以使用非常简单的语句利用其他列表创建新的列表。 例如&#xff0c;创建1到10的所有偶数的平方的列表&#xff1a; list [i*i for i in range(1,11) if i%20…

Spring Integration Java DSL示例

现在已经为Spring Integration引入了新的基于Java的DSL &#xff0c;这使得可以使用基于纯Java的配置而不是基于Spring XML的配置来定义Spring Integration消息流。 我尝试使用DSL来获得示例集成流–我称其为Rube Goldberg流 &#xff0c;因为它在尝试大写作为输入传递的字符串…

automake linux,Linux下automake软件编译与发布快速入门

Linux下automake软件编译与发布快速入门2008-04-22eNet&Ciweek进入编辑界面&#xff0c;输入内容如下&#xff1a;AUTOMAKE_OPTIONSforeignbin_PROGRAMSsimserver1 #软件包名称simserver1_SOURCESsimserver1.cpp  #源文件列表&#xff0c;如果有多个则用空格分开LIBS -l…

取消 Vue 中格式编译警告

使用VS Code在学习 Vue 的过程中&#xff0c;博主是在2.0之后开始学习的&#xff0c;在写项目的时候发现控制台经常会报一大堆的警告&#xff0c;都是关于格式的&#xff0c;有时候少空格&#xff0c;有时候多空格&#xff0c;不胜其烦&#xff0c;出现这个问题是因为在初始化的…

常用激活函数(激励函数)理解与总结

转载自https://blog.csdn.net/tyhj_sf/article/details/79932893 什么是激活函数&#xff1f; 神经网络中的每个神经元节点接受上一层神经元的输出值作为本神经元的输入值&#xff0c;并将输入值传递给下一层&#xff0c;输入层神经元节点会将输入属性值直接传递给下一层&#…

[原创]水知道答案吗?(一)

《水知道答案》是一本书的名字&#xff0c;我很有兴趣重复其中的试验&#xff0c;验证其真伪。书中提到的众多试验中&#xff0c;有一个试验最好做。实验内容&#xff1a;初始条件&#xff1a;取三个杯子&#xff0c;倒上相同水源的水&#xff0c;然后每个杯子放进一粒米饭粒。…

html5标签的兼容性处理

HTML5的语义化标签以及属性   1.可以让开发者非常方便地实现清晰的web页面布局&#xff0c;加上CSS3的效果渲染&#xff0c;快速建立丰富灵活的web页面显得非常简单 2.使用他们能让代码语义化更直观,而且更方便SEO优化。 但是此HTML5新标签在IE6/IE7/IE8上并不能识别&#xf…

Spring Security配置错误

我最近看到Mike Wienser的SpringOne2GX谈论了Application Security Pitfalls 。 如果您在Servlet容器上使用Spring的堆栈&#xff0c;这将非常有用&#xff0c;值得一看。 它使我想起了我曾经面临的一个严重的Spring Security Misconfiguration。 在Spring的指导项目Securing …

android fragmentactivity fragment,Android:Activity与Fragment通信(99%)完美解决方案

前言最近一直在想着能否有一种更好的方案来解决&#xff1a;Android中Activity与Fragment之间通信的问题&#xff0c;什么叫更好呢&#xff0c;就是能让Fragment的复用性高&#xff0c;性能还有好(不用反射)&#xff0c;代码还要好维护&#xff0c;不需要为每对Activity和Fragm…

分布式人工智能标记语言(DAIML)示例

DAIML&#xff08;Distributed Artificial Intelligence Markup Language&#xff09;是用于分布式人工智能系统中智能语言的标记库。DAIML主要分为Pattern和Template两部分&#xff0c;Pattern用于模式匹配&#xff0c;Template用于回答模板&#xff0c;下面将分别介绍两者的示…