【基础巩固】js值类型和引用类型

示例

值类型

let a = 100;
let b = a;
a = 200;
console.log(b); // 100 (互不影响)

引用类型

let a = { age: 20 };
let b = a;
a.age= 21;
console.log(b.age); // 21 (b.age随a.age的改变而改变)

存储方式

值类型


js变量存储在栈中,至于怎么存储咱先不管(毕竟我也不懂),这是js引擎的事情。
如图所示,key为变量名,value为存储内容,值类型变量的值直接存储在value中,a的值改变后并不会影响b的值。

引用类型


在栈中,引用类型存储的是内存地址,同时内存地址指向堆中的值,
简单地讲:引用类型a -> 内存地址1 -> a的值,此时若执行let b = a;,则是把b的内存地址指向了a的内存地址,而这个内存地址指向同一个值,所以a的值改变的时候,b的值也随之改变。

图片来源:学习资料

为什么引用类型要搞个内存地址?
众所周知最常见的引用类型是对象和数组,数组长度和对象属性数量是没有限制的,甚至可以嵌套,如果像存储值类型那样存储引用类型(没有内存地址,直接存储在栈中),那计算机怕是要炸了。

常见值类型和引用类型

// 常见值类型
let a; // undefined
const n = 100; // Number
const s = '100'; // String
const b = true; // Boolean
const s = Symbol('s') // Symbol(es6)
// 常见引用类型
const obj = { value: 100 }; // Object
const arr = [ 1, 2, 3 ]; // Array
const n = null; // 特殊引用类型,指针指向空地址
function fn() {} // 特殊引用类型,但不用于存储数据,所以不考虑深拷贝浅拷贝的问题

深拷贝

  • JSON.parse(JSON.stringify(obj))
    最简单的方式,但会忽略undefined,function,RegExp
  • Object.assign()或解构赋值(const a = {...obj}, const b = [...arr])
    只适合只有一层没有嵌套的对象或数组
  • 递归
const deepCopy = obj => {
    let copy = Array.isArray(obj) === true ? [] : {}
    for (var key in obj) {
        if (obj.hasOwnProperty(key)) {
            if (typeof obj[key] === 'object') {
                copy[key] = deepCopy(obj[key])
            } else {
                copy[key] = obj[key]
            }
        }
    }
    return copy
}

原文地址:https://www.cnblogs.com/deepdarkdeveloper/p/11888448.html

时间: 2024-10-10 09:11:04

【基础巩固】js值类型和引用类型的相关文章

传智的光辉岁月-C#基础篇五值类型和引用类型

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace P01Method { class Program { static void Main(string[] args) { //int a1 = 11; //int b2 = 22; //Add2Num(a1, b2);//在调用方法时,为 方法括号中 传递的 值 就叫做 实参(实际参数) //Add2Nu

js 值类型和引用类型

今天来给大家介绍一下数据类型的另一种解读,值类型和引用类型(及简单类型和复合类型) 一.基本概念 ECMAscript变量包括两种不同的数据类型的值,一种叫做简单类型(值类型),指的是简单的数据段,另一种叫做复合数据类型(引用类型),是由多个值构成的对象. 在js的数据类型中,number,boolean,string,null和undefined都属于值类型,而函数和对象属于引用类型. 二.数据类型判断 基本类型:typeof 引用类型:instanceof var a=10; console

js值类型与引用类型

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

C# 类型基础 值类型和引用类型

引言 本文之初的目的是讲述设计模式中的 Prototype(原型)模式,但是如果想较清楚地弄明白这个模式,需要了解对象克隆(Object Clone),Clone其实也就是对象复制.复制又分为了浅度复制(Shallow Copy)和深度复制(Deep Copy),浅度复制和深度复制又是以如何复制引用类型成员来划分的.由此又引出了引用类型和值类型,以及相关的对象判等.装箱.拆箱等基础知识.索性从最基础的类型开始自底向上写起. 值类型和引用类型 先简单回顾一下C#中的类型系统.C# 中的类型一共分为

JS中值类型和引用类型

一.值类型 例子: 1 var a=10; 2 var b=a; 3 a=20; 4 console.log(b); //10 例子中,将a的值赋给了b,b=10,然后改变a的值不会影响b的值,a和b是独立的两份,互不影响. 二.引用类型 例子: 1 var a={age:10}; 2 var b=a; 3 b.age=20; 4 console.log(a.age); //20 例子中,a和b同时指向一个对象,即 {age:10} ,a和b互相影响,所以当改变其中一个值时,另一个也相应改变 引

20151024_001_C#基础知识(静态与非静态的区别,值类型和引用类型,堆和栈的区别,字符串的不可变性,命名空间)

1:我们把这些具有相同属性和相同方法的对象进行进一步的封装,抽象出来类这个概念. 类就是个模子,确定了对象应该具有的属性和方法. 对象是根据类创建出来的. 2:类:语法 [public] class 类名 { 字段; 属性; 方法; } 写好了一个类之后,我们需要创建这个类的对象,那么,我们管创建这个类的对象过程称之为类的实例化.使用关键字new 实例化类===创建类 this:表示当前这个类的对象. 类是不占内存的,而对象是占用内存的. 结构是面向过程的,类是面向对象的,之前没有面向对象的时候

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

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

C#基础知识----值类型与引用类型

CLR支持两种基本类型:值类型和引用类型 那么又有哪些数据类型是值类型的   又有哪些数据类型是引用类型的呢?请看下面的简单归纳: 值类型: 所有的数值类型(long int short byte ulong uint ushort sbyte decimal double float) bool 枚举(enum) 结构(struct) 引用类型: string 数组 类(class) 接口(interface) 引用类型和值类型的划分依据:  他们在内存中的存储方式不同      内存最重要的

C#基础(六)——值类型与引用类型

CLR支持两种类型:值类型和引用类型. 值类型包括C#的基本类型(用关键字int.char.float等来声明),结构(用struct关键字声明的类型),枚举(用enum关键字声明的类型):而引用类型包括类(用class关键字声明的类型)和委托(用delegate关键字声明的特殊类)等. C#中的每一种类型要么是值类型,要么是引用类型.所以每个对象要么是值类型的实例,要么是引用类型的实例.值类型的实例通常是在线程栈上分配的(静态分配),但是在某些情形下可以存储在堆中.引用类型的对象总是在进程堆中