基本类型引用类型的复制传递参数
Posted L_mj
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基本类型引用类型的复制传递参数相关的知识,希望对你有一定的参考价值。
- 基本类型:指的是简单的数据段,Undefined、Null、Boolean、Number 和 String。他们是按照值进行分配的,存放在栈(stack)内存中的简单数据段,数据大小确定,内存空间大小可以分配。 基本数据类型是按值访问的,因为可以操作保存在变量中的实际值。
- 引用类型:指那些由多个值构成的对象。引用类型的值是保存在内存中的对象,即存放在堆(heap)内存中的对象。javascript不允许访问内存中的位置,也就是说不能直接操作对象的内存空间。在操作对象时,实际上是在操作对象的引用而不是实际的对象,为此,引用类型的值是按引用访问的。栈内存中存放的只是该对象的访问地址,在堆内存中为这个值分配空间。由于这种值的大小不固定,因此不能把它们保存到栈内存中。但内存地址大小的固定的,因此可以将内存地址保存在栈内存中。 这样,当查询引用类型的变量时, 先从栈中读取内存地址, 然后再通过地址找到堆中的值。对于这种,我们把它叫做按引用访问。
为什么会有栈内存和堆内存之分?
通常与垃圾回收机制有关。为了使程序运行时占用的内存最小。
当一个方法执行时,每个方法都会建立自己的内存栈,在这个方法内定义的变量将会逐个放入这块栈内存里,随着方法的执行结束,这个方法的内存栈也将自然销毁了。因此,所有在方法中定义的变量都是放在栈内存中的;
当我们在程序中创建一个对象时,这个对象将被保存到运行时数据区中,以便反复利用(因为对象的创建成本通常较大),这个运行时数据区就是堆内存。堆内存中的对象不会随方法的结束而销毁,即使方法结束后,这个对象还可能被另一个引用变量所引用(方法的参数传递时很常见),则这个对象依然不会被销毁,只有当一个对象没有任何引用变量引用它时,系统的垃圾回收机制才会在核实的时候回收它。
复制变量值
1、基本类型的复制
从一个变量向另一个变量复制基本类型的值,会在变量对象上创建一个新值,然后把该值复制到新变量分配的位置上。在此之后的任何操作,两个值之间互不影响。
2、引用类型的复制
当从一个变量向另一个变量复制引用类型的值时,同样也会在变量对象中的值复制一份到为新变量分配的空间中。不同的是,这个值的副本实际上是一个指针,而这个指针指向存储在堆中的一个对象。复制操作结束后,两个变量实际上将引用同一个对象。因此,改变其中一个变量,就会影响另一个变量。
传递参数
ECMAScript中所有函数的参数都是按值传递的。也就是说,把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。基本类型值的传递同基本类型变量的复制一样,而引用类型值的传递,则如同引用类型变量的复制一样。
在向参数传递基本类型的值时被传递的值会被复制给一个局部变量(即命名参数,或者用ECMAScript的概念来说,就是arguments对象中的一个元素)。在向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反映在函数的外部。
按值传递、按引用传递、按共享传递 (之间的区别见此文)
检测类型
- typeof操作符:确定一个变量是不是基本类型的最佳工具。如果变量的值是一个对象或null,则typeof操作符将返回“object”。
- instanceof操作符:确定变量是什么类型的对象。
以上是关于基本类型引用类型的复制传递参数的主要内容,如果未能解决你的问题,请参考以下文章