值类型和引用类型的特征

1. 值类型和引用类型的赋值

1.1. 值类型赋值,直接将值复制一份

var num1 = 10;
var num2 = num1;

上面两句代码,在内存中的体现为:

  • var num1 = 10;表示变量num1存储的是数字10
  • 将数据拷贝一份,也就是将10拷贝一份,这个时候内存中有两个10
  • 将拷贝的10赋值给num2

1.2. 引用类型赋值,是将地址复制一份

var p = {name:"张三", age:19};
var p1 = p;

上面两句代码,在内存中的体现为:

  • var p = {name:"张三", age:19};,p中存储的是对象的地址
  • 赋值就是将变量p中存储的数据,也就是地址拷贝一份, 然后将该数据赋值给p1
  • 此时内存中只有 1 个对象,变量pp1同时指向这个对象

问题: 利用p1修改的name属性会影响到p中的name

2. 值类型和引用类型做参数

考虑如下情况:输出结果是多少?

function foo(num){
    num++;
}

var a = 1;
foo(a);
console.log(a);

继续考虑如下情况:输出结果是多少?

function foo(o){
    o.age++;
}

var p = {name:"张三", age:19};

foo(p);

console.log(p.age);

总结:

  • 在调用函数的时候,传参的过程其实就是用实参给形参赋值的过程
  • 当参数为值类型的时候,函数内和函数外的两个变量完全不同,仅仅只是存的值一样而已,修改时互不影响
  • 当参数为引用类型的时候,函数内和函数外的两个变量不同,但是共同指向同一个对象,在函数内修改对象数据时会影响外部

扩展:

考虑如下情况:输出结果是多少?


function foo(o){
    o = {name:"张三", age:18};
}

var p;
foo(p);

console.log(p.age);
时间: 2024-11-05 18:44:17

值类型和引用类型的特征的相关文章

定义类+类实例化+属性+构造函数+匿名类型var+堆与栈+GC回收机制+值类型与引用类型

为了让编程更加清晰,把程序中的功能进行模块化划分,每个模块提供特定的功能,而且每个模块都是孤立的,这种模块化编程提供了非常大的多样性,大大增加了重用代码的机会. 面向对象编程也叫做OOP编程 简单来说面向对象编程就是结构化编程,对程序中的变量结构划分,让编程更清晰. 类的概念: 类实际上是创建对象的模板,每个对象都包含数据,并提供了处理和访问数据的方法. 类定义了类的每个对象(称为实例)可以包含什么数据和功能. 类中的数据和函数称为类的成员:数据成员        函数成员 数据成员: 数据成员

C#值类型和引用类型用C语言理解

我刚用C#一个来月,可能理解得不对,还请大家指教. 读懂文章你需要对C语言的指针有所理解. 需要注意区别:对C\C++来说,任何类型都可以当成C#的"引用类型",因为有指针. [在内存上] void foo() { int aaa = 0; //值类型,aaa在Stack上分配(SUB ESP,XX) int* paaa = new int[123]; //引用类型,paaa在Heap上分配,HeapAlloc(GetProcessHeap()...) foo2(&aaa);

js值类型与引用类型

JavaScript值类型和引用类型有哪些 (1)值类型:数值.布尔值.null.undefined. (2)引用类型:对象.数组.函数. 三.如何理解值类型和引用类型及举例 我们可以用"连锁店"和"连锁店钥匙"来理解,不知道以下比喻合不合适,^-^. (1)值类型理解:变量的交换等于在一个新的地方按照连锁店的规范标准(统一店面理解为相同的变量内容)新开一个分店,这样新开的店与其它旧店互不相关.各自运营. [值类型例子] 代码如下: function chainSt

c#学习基础(2)存储、值类型和引用类型、变量

程序运行时,它的数据必须存储在内存中,数据项需要多大的内存.存储在什么地方以及如何存储都依赖该数据项的类型 运行中的程序使用两个区域来存储数据:栈和堆 栈是一个内存数组,是一个LIFO(last in first out后进先出)的数据结构 栈存储几种类型的数据: 某些类型变量的值 程序当前执行环境 传递给方法的参数 栈有以下几大特征 数据只能从栈的顶端插入和删除 把数据放到栈顶端称为入栈push 从栈顶删除数据称为出栈pop 堆是一块内存区域,在队里可以分配大块的内存用于存储某类型的数据. 与

Swift 值类型和引用类型

Swift中的类型分为两类:一,值类型(value types),每个值类型的实例都拥有各自唯一的数据,通常它们是结构体,枚举或元组:二,引用类型(reference types),引用类型的实例共享它们的数据,通常是一个类.在这篇文章中我们将会探索值类型和引用类型的价值,以及如何在它们二者间抉择. 有什么区别? 值类型最基本的特征就是复制在赋值.初始化和传递参数过程中的数据,并为这个数据创建一个独立的实例: // 值类型例子 struct S { var data: Int = -1 } va

JavaScript基本数据类型及值类型和引用类型

在JavaScript中四种基本的数据类型:数值(整数和实数).字符串型(用“”号或‘'括起来的字符或数值).布尔型(使True或 False表示)和空值.在JavaScript的基本类型中的数据可以是常量,也可以变量.由于JavaScript采用弱类型的形式,因而一个数据的 变量或常量不必首先作声明,而是在使用或赋值时确定其数据的类型的.当然也可以先声明该数据的类型,它是通过在赋值时自动说明其数据类型的. javascript中的变量 javascript中的变量只是一个占位符,前言已经说过了

.NET之值类型与引用类型

C#是类型安全的开发语言,它的数据类型分为值类型(Value Type)和引用类型(Reference Type)两种. 一.值类型(Value Type) 字     符:char U+0000 - U+ffff 16位 Unicode字符(其实字符也是一种整型) 整     型:sbyte.byte.short.ushort.int.uint.long.ulong 浮 点 型:float(7位有效为).double(15到16位有效位) decimal:128位数据类型,相比浮点型而言具有更

多态、里氏替换原则、值类型与引用类型

1.多态 (1).同一物体在不同场合下,表现出多种特征 (2).不同对象接收到相同消息时,会产生不同反映 (3).发生多态的前提是继承 2.里氏替换原则(在继承的前提下) (1).子类替换父类 (2).父类替换子类 (3).父new子显示的是子类 3.值类型与引用类型 值类型:存在堆栈中,占用内存大,但读取速度快. 引用类型:存在内存堆中,占用内存小,但读取速度快. ref与out(引用替换): 写在传递和定义前,ref必须先赋值,out可以不先赋值. public void meth1() {

C# OOP之五 深入理解值类型和引用类型

内存分配 我们在前面的章节已经了解了值类型和引用类型,下面我们重点讲下值类型和引用类型在内存中的分配情况. 值类型实例通常分配在栈(Stack)上,并且不包含任何指向实例数据的地址,因为变量包含了其实例数据.值类型主要包括简单类型.结构体类型和枚举类型. 例如如下代码:int  iCount=50;  //声明和初始化变量iCount int iSum=iCount; //将iCount中的数据赋值给iSum iCount++;            //增加iCount对iSum无关 在内存中