索鸟网

  1. 首页
  2. 《javascript高级程序设计》笔记:值类型与引用类型

《javascript高级程序设计》笔记:值类型与引用类型


基本数据类型是按值访问的,因为可以操作保存在变量中的实际的值;
引用类型的值是保存在内存中的对象,在操作对象时,实际上是在操作对象的引用而不是实际的对象;

值类型

如果一个变量存储的是值的本身那么就是一个值类型number / string / Boolean / Null / Undefined —值类型的变量本身就是含有赋予给它的数值的,它的变量本身及保存的数据都存储在栈的内存块当中,当声明一个值类型时,必须对它初始化(给变量赋值)才能使用

// 值类型
var num1 = 123;
var num2 = num;         // 实际上是将 num的值传给 num2
num1 = 456;
console.log(num2);      // 123

将值类型复制给另外一个值时(num2=num1),也就是num2重新再栈上开辟了一块空间,然后将num1中的内容复制一份放在num2中,当改变其中一个变量的值时,不会影响另外一个变量的值

引用类型

如果一个变量存储的是引用(地址),那么就是一个引用类型object—引用类型的值的存储与值类型不同,它分别存储在内存的堆和栈中,栈中存放的是指向堆中内容的地址,堆中存放的引用类型的地址(键值对)

var obj1 = {name: "xiaoming"};    //obj 中存储的是 对象 的地址
var obj2 = obj1;                  //这句话,表示把 obj 指向对象的地址交给了 obj2 
obj1.name = "xiaozhi";            //这句话,表示通过 obj 找到obj指向的对象,然后修改
                                  // 对象中的name属性, 值修改为: "xiaozhi"
console.log(obj2.name);           // xiaozhi

obj2=obj1表示的是将栈上的地址复制一份给另一个对象,他们同时指向堆中的内容,当修改内容时,两个对象中的值都会发生改变

一个面试题

var o = new Object();
function foo(obj) {
    obj.name = "腐女";
    obj = new Object();
    obj.name = "屌丝";
}
foo(o);
console.log(o.name); // ???

// 创建对象( 引用类型 )
var o = new Object();
function foo(obj) {
// obj 与 o 是什么关系?
// 两个变量都指向了同一个对象
// 怎么理解函数的参数: 把函数参数当作是函数内部
// 函数的参数只能在函数内部使用
// 函数的参数不需要 var 声明,因为在JS引擎内部已经声明好了,直接就可以使用
// 直接就是给 o 指向的对象 设置了一个name属性的,值为: 腐女
    obj.name = "腐女";
// 创建一个新的对象,然后让 obj 指向了这个新创出来的对象
// 因为一个变量不可能同时指向两个对象, 所以, 这个obj与原来指向的对象(o) 就没有任何关系了!
    obj = new Object();
    obj.name = "屌丝";
}
// 调用函数, 将 o 作为实参传给了 foo 函数
foo(o);
console.log(o.name); // 腐女

图解值类型和引用类型

javascript

来源地址:https://segmentfault.com/a/1190000010641791 版权归作者所有!

相关教程

  • 《javascript高级程序设计》笔记:Number类型

    进制表示 谈到Number类型,不得不提进制(此处不做过多介绍)八进制字面值的第一位必须是零(0),然后是八进制数字序列(0~7)十六进制字面值的前两位必须是 0x,后跟任何十六进制数字(0~9 及 A~F) var intNum = 55; // 整型 var octalNum1 = 070; // 八进制的56 var oc
  • 《javascript高级程序设计》笔记:Function类型

    这么长时间没有写博客,就是因为函数这部分比较麻烦,自己一直想抽出大把的时间来研究这个,可是结果却是一拖再拖,这样不好。有时间就写才是王道啊,不然这计划得一直卡在这里了.. 1. 几个概念 函数:将代码进行封装, 复用的逻辑单元(代码)对象:无序键值对的集合数组:有序键值对的集合, 数组的索引号就是键属性:对象属性的值是一个普通的数据方法:对象的属性是一个
  • C# 值类型与引用类型 null与可空类型

    一,值类型与引用类型 值类型就是内存中某处位置保存的值,该值具备实际意义。比如int i=10;内存中的10就是i的值。 引用类型也是内存中保存的值,但是该值指向内存中其他位置。比如String str=”123”。str保存的实际上是”123”在内存中存储的位置的地址,只是我们在使用的时候C#语言知道str是引用类型就把对应的”123”取出来给我们用。 二,null的含义 值类型总是包含
  • Swift 值类型和引用类型

    Swift中的类型分为两类:一,值类型(value types),每个值类型的实例都拥有各自唯一的数据,通常它们是结构体,枚举或元组;二,引用类型(reference types),引用类型的实例共享它们的数据,通常是一个类。在这篇文章中我们将会探索值类型和引用类型的价值,以及如何在它们二者间抉择。 有什么区别? 值类型最基本的特征就是复制在赋值、初始化和
  • 《javascript高级程序设计》笔记:Sting类型及其转换

    字符串的不可变性 ECMAScript 中的字符串是不可变的,也就是说,字符串一旦创建,它们的值就不能改变。要改变 某个变量保存的字符串,首先要销毁原来的字符串,然后再用另一个包含新值的字符串填充该变量 通俗的说,操作字符串时并不会在原来的字符串上修改,而是重新开辟内存,生成新的字符串,把变量重新指向新的字符串,原来的字符串不会马上消失,要等待垃圾回收机
  • JS值类型、引用类型、强制类型转换

    1、js中的数据类型 js中有5中简单数据类型(也称为基本数据类型): Undefined、Null、Boolean、Number和String。一种复杂类型:Object 2、js变量按照存储类型分为值类型和引用类型 值类型: string number boolean undefined 引用类型: Object Array Function //数
  • JavaScript学习笔记 - 引用类型

    本文记录了我在学习前端上的笔记,方便以后的复习和巩固。 Object类型 Array类型 Date类型 RegExp类型 Function类型 基本包装类型 单体内置对象 引用类型的值(对象)是引用类型的一个实例。引用类型是一种数据结构,用于将数据和功能组织在一起。也常被称为类。引用类型有时候也被称为对象定义,因为它们描述的是一类对象所具有的属性和方
  • JavaScript基本类型与引用类型复制变量值

    在学习JavaScript变量后,我们知道从一个变量向另一个变量复制基本类型的值跟引用类型的值时,是存在不同的。来看一个例子: var num1=5; var num2=num1; num1=10; console.log(num1);//10 console.log(num2);//5 在这个例子中用num1中的值用来初始化num2,所以num2中保存的值为5,但后来