基本类型引用类型的复制传递参数

Posted L_mj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基本类型引用类型的复制传递参数相关的知识,希望对你有一定的参考价值。

  • 基本类型:指的是简单的数据段,Undefined、Null、Boolean、Number 和 String。他们是按照值进行分配的,存放在栈(stack)内存中的简单数据段,数据大小确定,内存空间大小可以分配。 基本数据类型是按值访问的,因为可以操作保存在变量中的实际值
  • 引用类型:指那些由多个值构成的对象。引用类型的值是保存在内存中的对象,即存放在堆(heap)内存中的对象javascript不允许访问内存中的位置,也就是说不能直接操作对象的内存空间。在操作对象时,实际上是在操作对象的引用而不是实际的对象,为此,引用类型的值是按引用访问的。栈内存中存放的只是该对象的访问地址,在堆内存中为这个值分配空间由于这种值的大小不固定,因此不能把它们保存到栈内存中。但内存地址大小的固定的,因此可以将内存地址保存在栈内存中。 这样,当查询引用类型的变量时, 先从栈中读取内存地址, 然后再通过地址找到堆中的值。对于这种,我们把它叫做按引用访问。

为什么会有栈内存和堆内存之分?

     通常与垃圾回收机制有关。为了使程序运行时占用的内存最小。

     当一个方法执行时,每个方法都会建立自己的内存栈,在这个方法内定义的变量将会逐个放入这块栈内存里,随着方法的执行结束,这个方法的内存栈也将自然销毁了。因此,所有在方法中定义的变量都是放在栈内存中的;

     当我们在程序中创建一个对象时,这个对象将被保存到运行时数据区中,以便反复利用(因为对象的创建成本通常较大),这个运行时数据区就是堆内存。堆内存中的对象不会随方法的结束而销毁,即使方法结束后,这个对象还可能被另一个引用变量所引用(方法的参数传递时很常见),则这个对象依然不会被销毁,只有当一个对象没有任何引用变量引用它时,系统的垃圾回收机制才会在核实的时候回收它。

复制变量值

1、基本类型的复制

从一个变量向另一个变量复制基本类型的值,会在变量对象上创建一个新值,然后把该值复制到新变量分配的位置上。在此之后的任何操作,两个值之间互不影响

2、引用类型的复制

当从一个变量向另一个变量复制引用类型的值时,同样也会在变量对象中的值复制一份到为新变量分配的空间中。不同的是,这个值的副本实际上是一个指针,而这个指针指向存储在堆中的一个对象。复制操作结束后,两个变量实际上将引用同一个对象。因此,改变其中一个变量,就会影响另一个变量

 

 传递参数

ECMAScript中所有函数的参数都是按值传递的。也就是说,把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。基本类型值的传递同基本类型变量的复制一样,而引用类型值的传递,则如同引用类型变量的复制一样。

在向参数传递基本类型的值时被传递的值会被复制给一个局部变量(即命名参数,或者用ECMAScript的概念来说,就是arguments对象中的一个元素)。在向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反映在函数的外部。

按值传递、按引用传递、按共享传递     (之间的区别见此文)

检测类型

  • typeof操作符:确定一个变量是不是基本类型的最佳工具。如果变量的值是一个对象或null,则typeof操作符将返回“object”。
  • instanceof操作符:确定变量是什么类型的对象。

以上是关于基本类型引用类型的复制传递参数的主要内容,如果未能解决你的问题,请参考以下文章

带你深入理解传递参数

值传递和引用传递

Java——值传递与引用传递

JavaScript 参数传递与变量复制

2020年8月2日 方法的传递机制(参数是基本数据类型参数是引用数据类型)

第4章变量作用域和内存问题