博客
关于我
JavaScript 知识梳理[一] 变量类型,浅拷贝,深拷贝
阅读量:590 次
发布时间:2019-03-12

本文共 1479 字,大约阅读时间需要 4 分钟。

JavaScript 变量类型及深浅拷贝

在编程语言中,变量的类型是理解和操作程序的基础。JavaScript 和 Java 等语言一样,变量的类型直接影响数据处理方式。了解变量类型的特性,可以帮助我们在数据复用或处理时做出合适的选择。

变量类型

变量类型可以分为 值类型引用类型。值类型包括:

  • 基本类型number(数字)、string(字符串)、boolean(布尔)、null(空值)、undefined(未定义)、symbol(符号)和 bigint(大整数)。
  • 数组类型Array
  • 函数类型Function

引用类型则包括:

  • 对象类型Object(普通对象)、Date(日期)、RegExp(正则表达式)等。
  • 数组类型Array(实际上归类于值类型,但在实现上存储为引用类型)。
  • 函数类型Function(归类于值类型,但在实现上可视为引用类型)。

值类型与引用类型的存储方式

值类型直接存储在栈中,程序执行时会直接获取这些值。而引用类型存储的不是实际数据,而是数据的地址(引用)。栈中存储的是引用地址,而实际数据存储在堆中。

浅拷贝与深拷贝

浅拷贝和深拷贝都针对引用类型的数据。两者的主要区别在于,浅拷贝是否复制目标对象的地址,而深拷贝是否复制目标对象的实际内容。

浅拷贝

浅拷贝仅拷贝引用地址,例如:

const obj = { a: 1 };const copy = obj; // 浅拷贝,copy 和 obj 引用同一个对象obj.a = 2; // 修改后,copy.a 也会变成 2

深拷贝

深拷贝会创建一个新的对象,复制目标对象的所有属性值,例如:

const obj = { a: 1 };const deepCopy = JSON.parse(JSON.stringify(obj)); // 创建新对象obj.a = 2; // 修改原对象,深拷贝对象保持 a: 1

实现深拷贝的方法

  • Object.assign 方法
  • const obj = { a: 1 };const copy = Object.assign({}, obj); // 深拷贝
    1. 解构赋值
    2. const { a, b } = obj;const copy = { a, b }; // 浅拷贝
      1. JSON 转换法
      2. const obj = { a: 1 };const copy = JSON.parse(JSON.stringify(obj)); // 深拷贝
        1. 递归拷贝
        2. function deepClone(obj) {  if (typeof obj !== 'object' || obj === null) {    return obj;  }  const result = Array.isArray(obj) ? [] : {};  for (const key in obj) {    if (obj.hasOwnProperty(key)) {      result[key] = deepClone(obj[key]);    }  }  return result;}

          通过上述方法,可以实现对引用类型数据的深拷贝。需要注意的是,深拷贝的方法是否真正实现深拷贝,取决于对象的结构(如是否包含嵌套对象或数组)。

          总结

          理解变量类型和深浅拷贝是编程的核心技能之一。值类型和引用类型的区别直接影响数据操作方式,而深浅拷贝则帮助我们在数据复用时避免意外修改。通过合理选择拷贝方法,可以确保程序的安全性和正确性。

    转载地址:http://qtdxz.baihongyu.com/

    你可能感兴趣的文章
    Python学习笔记——元组
    查看>>
    异常声音检测
    查看>>
    打造自己的图像识别模型1— 数据准备-将图像数据转为tfrecord形式——【何之源-21个项目玩转深度学习】
    查看>>
    无法打开文件“opencv_world330d.lib”的解决办法
    查看>>
    maven项目出现 Missing artifact jdk.tools:jdk.tools:jar:1.7
    查看>>
    maven项目通过Eclipse上传到svn上面,再导入到本地出现指定的类找不到的问题
    查看>>
    maven 项目部署到tomcat下 没有class文件
    查看>>
    算法训练 未名湖边的烦恼(递归,递推)
    查看>>
    算法训练 完数(循环,数学知识)
    查看>>
    什么是接口
    查看>>
    iview组件库中,Form组件里的Input,无法正确绑定on-enter事件
    查看>>
    记录-基于springboot+vue.js实现的超大文件分片极速上传及流式下载
    查看>>
    JavaScript高级程序设计第四版学习记录-第九章代理与反射
    查看>>
    怎么解决Windows 10文件/文件夹正在使用无法删除
    查看>>
    matlab函数:fix 向0取整
    查看>>
    Allegro中如何消除器件本身Pin间距报错
    查看>>
    Flask--简介
    查看>>
    16 python基础-恺撒密码
    查看>>
    Frame--Api框架
    查看>>
    Boostrap技能点整理之【网格系统】
    查看>>