JavaScript 简单类型与复杂类型

在JavaScript中,根据数据存储的方式不同,变量可以分为两大类:简单类型(也称为基本数据类型或原始类型)和复杂类型(也称为引用数据类型)。理解这两者的区别对于编写高效且无误的代码至关重要。本文将详细介绍JavaScript中的简单类型和复杂类型,并探讨它们各自的特性及其应用场景。

简单类型(基本数据类型)

简单类型是指那些直接存储在栈内存中的数据类型,其值直接存储在变量的位置上。JavaScript中有六种简单类型:

  • undefined
  • null
  • boolean
  • number
  • string
  • symbol (ES6新增)

特性

  1. 按值传递:当简单类型的值被作为参数传递给函数时,实际上是创建了一个副本,这意味着对参数的任何修改都不会影响原始值。

    function changeValue(x) {
        x = 10;
    }
    let a = 5;
    changeValue(a);
    console.log(a); // 输出: 5
  2. 比较方式:两个简单类型的变量通过===运算符进行比较时,只有当两者的内容完全相同时才会返回true

    console.log(5 === 5); // 输出: true
    console.log('hello' === 'hello'); // 输出: true

常见用法

  • 布尔值用于控制流程(如条件语句和循环)。
  • 数字用于数学计算。
  • 字符串用于文本处理。
  • **未定义(undefined)**表示尚未赋值的变量。
  • **空值(null)**表示有意设置为空的值。
  • **符号(Symbol)**提供了一种创建唯一标识符的方法,通常用于对象属性键。

复杂类型(引用数据类型)

复杂类型指的是那些存储在堆内存中的数据类型,变量实际上保存的是指向实际数据的一个引用地址。JavaScript中最常见的复杂类型包括:

  • Object
  • Array
  • Function
  • 其他自定义对象

特性

  1. 按引用传递:当一个复杂类型的值被作为参数传递给函数时,传递的是该对象的引用地址而不是副本。因此,在函数内部对该对象所做的任何更改都会反映到原始对象上。

    function modifyObject(obj) {
        obj.name = "World";
    }
    let obj = { name: "Hello" };
    modifyObject(obj);
    console.log(obj.name); // 输出: World
  2. 比较方式:两个复杂类型的变量通过===运算符进行比较时,只有当两者引用的是同一个对象时才会返回true

    let obj1 = { name: "Alice" };
    let obj2 = obj1;
    console.log(obj1 === obj2); // 输出: true
    
    let obj3 = { name: "Alice" };
    console.log(obj1 === obj3); // 输出: false

常见用法

  • 对象用于封装数据和方法,支持面向对象编程。
  • 数组用于存储有序的数据集合。
  • 函数不仅可以作为过程调用,还可以作为一等公民被赋值给变量、作为参数传递或返回值。

实际应用案例

案例1:简单类型的比较

let num1 = 10;
let num2 = 10;
console.log(num1 === num2); // 输出: true

let str1 = "test";
let str2 = "test";
console.log(str1 === str2); // 输出: true

案例2:复杂类型的比较

let arr1 = [1, 2, 3];
let arr2 = [1, 2, 3];
console.log(arr1 === arr2); // 输出: false

let obj1 = { key: "value" };
let obj2 = obj1;
console.log(obj1 === obj2); // 输出: true

案例3:浅拷贝 vs 深拷贝

由于复杂类型是按引用传递的,直接赋值不会复制对象本身,而是复制了引用。为了创建对象的独立副本,我们需要使用深拷贝技术。

let original = { a: 1, b: { c: 2 } };
let shallowCopy = Object.assign({}, original);
let deepCopy = JSON.parse(JSON.stringify(original));

original.b.c = 3;

console.log(shallowCopy.b.c); // 输出: 3
console.log(deepCopy.b.c);    // 输出: 2

结语

感谢您的阅读!如果你有任何问题或想分享自己的经验,请在评论区留言交流!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/977508.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构 之 【无头单向非循环链表】(C语言实现)

下面将 无头单向非循环链表 简称为 单链表 头指针&#xff1a;指向链表第一个节点的指针 链表为空时&#xff0c;头指针也为空 要实现单链表&#xff0c;就是要实现单链表的 增删查改 一、无头单向非循环链表的c语言实现 1.准备工作 #include <stdio.h> #include <s…

傅里叶变换+注意力机制!CCF-A离你并不遥远!

今天给大家推荐一个&#xff0c;创新Top且热度持续攀升的方向&#xff1a;傅里叶变换注意力机制&#xff01; 傅里叶变换能够捕捉到频域的特征&#xff0c;而注意力机制则能使模型专注任务相关信息。两者结合&#xff0c;不仅能提升模型的性能和效率&#xff0c;还能增强模型的…

【学习笔记】计算机网络(四)

第4章 网络层 文章目录 第4章 网络层4.1 网络层的几个重要概念4.1.1 网络层提供的两种服务虚电路服务&#xff08;Virtual Circuit Service&#xff09;数据报服务&#xff08;Datagram Service&#xff09; 4.1.2 网络层的两个层面 4.2 网际协议 IP - IPv44.2.1 虚拟互连网络4…

Ollama部署本地大模型DeepSeek-R1-Distill-Llama-70B

文章目录 一、下模二、转模1. 下载转换工具2. 安装环境依赖3. llama.cpp1. 转换脚本依赖2. llama.cpp安装依赖包3. llama.cpp编译安装4. 格式转换 三、Ollama部署1. 安装启动Ollama2. 添加模型3. 测试运行 一、下模 #模型下载 from modelscope import snapshot_download model…

【GPT】从GPT1到GPT3

every blog every motto: Although the world is full of suffering&#xff0c; it is full also of the overcoming of it 0. 前言 从GPT1 到GPT3 1. GPT1 论文&#xff1a; https://s3-us-west-2.amazonaws.com/openai-assets/research-covers/language-unsupervised/lan…

stm32使用(无线串口)实现收发、判断数据+DMA(HAL库)

目录 前言&#xff1a; 1. 用CubeMX配置串口DMA所需要的环境 &#xff08;1&#xff09;打开CubeMAX&#xff0c;点击红框 &#xff08;2&#xff09;查找stm32F103C8T6的芯片 &#xff08;3&#xff09;配置SYS &#xff08;4&#xff09;配置RCC时钟 &#xff08;5&am…

QT入门--QMainWindow

从上向下依次是菜单栏&#xff0c;工具栏&#xff0c;铆接部件&#xff08;浮动窗口&#xff09;&#xff0c;状态栏&#xff0c;中心部件 菜单栏 创建菜单栏 QMenuBar* mybar1 menuBar(); 将菜单栏放到窗口中 setMenuBar(mybar1); 创建菜单 QMenu *myfilemenu mybar1-…

重构清洁想象,石头科技首创五轴仿生机械手打破传统清洁边界

2月25日&#xff0c;主题为“重构清洁想象”的石头科技2025发布会在上海天文馆正式召开。石头科技清洁产品BU总裁钱启杰在会上宣布&#xff0c;石头科技正式成为上海天文馆授权合作伙伴&#xff0c;希望借助航天科技到家庭科技的跨越&#xff0c;进一步简化家庭清洁工作&#x…

Amazon Outposts:构建混合云的安全堡垒,让数据安全“零距离”

在数字化转型的浪潮中&#xff0c;企业纷纷拥抱混合云架构以兼顾敏捷性与本地化需求。然而&#xff0c;如何确保数据在本地与云端的无缝流转中始终安全可控&#xff0c;成为企业面临的核心挑战。Amazon Outposts 作为AWS推出的混合云解决方案&#xff0c;不仅将原生AWS服务延伸…

详解Redis如何持久化

引言 本文介绍了 Redis 的两种持久化方式&#xff1a;RDB 和 AOF。RDB 按时间间隔快照存储&#xff0c;AOF 记录写操作。阐述了它们的配置、工作原理、恢复数据的方法、性能与实践建议&#xff0c;如降低 fork 频率、控制内存等&#xff0c;还提到二者可配合使用&#xff0c;最…

【Ambari】Ranger KMS

目录 一、Ranger KMS介绍 二、KMS基于Ranger插件安装 一、Ranger KMS介绍 Ranger KMS是把数据存储入后台数据库中。通过Ranger Admin可以集中化管理KMS服务。 Ranger KMS有三个优点 l Key management Ranger admin 提供了创建&#xff0c;更新&#xff0c;删除密钥的Web UI…

vscode设置终端复制快捷键(有坑!!!)

vscode的编辑页面和终端的复制粘贴快捷键是不一样的。 vscode的终端复制快捷键为ctrlshiftC&#xff0c;当然&#xff0c;自己可以自定义设置 vscode设置终端复制快捷键&#xff08;有坑&#xff01;&#xff01;&#xff01;&#xff09;_vs code 不能复制-CSDN博客文章浏览…

angular舒尔特方格

说明&#xff1a;我计划用angular实现舒尔特方格的功能&#xff0c;必须是动态的&#xff0c;比如33&#xff0c;55&#xff0c;9*9&#xff0c;而且无论是什么样式的&#xff0c;都必须保持正方形&#xff0c;然后还有时间监听&#xff0c;计算用户完成方格的时间&#xff0c;…

提升数据洞察力:五款报表软件助力企业智能决策

概述 随着数据量的激增和企业对决策支持需求的提升&#xff0c;报表软件已经成为现代企业管理中不可或缺的工具。这些软件能够帮助企业高效处理数据、生成报告&#xff0c;并将数据可视化&#xff0c;从而推动更智能的决策过程。 1. 山海鲸报表 概述&#xff1a; 山海鲸报表…

DistilQwen2.5发布:通义千问蒸馏小模型再升级

01 引言 因高计算成本和复杂性&#xff0c;在例如移动设备和边缘计算场景等资源有限的环境中&#xff0c;限制了大语言模型的普及。如何在保留模型性能的同时提高计算效率并降低部署成本&#xff0c;已成为研究和工业界必须面对的关键挑战。 在此背景下&#xff0c;我们正式…

VS2022配置FFMPEG库基础教程

1 简介 1.1 起源与发展历程 FFmpeg诞生于2000年&#xff0c;由法国工程师Fabrice Bellard主导开发&#xff0c;其名称源自"Fast Forward MPEG"&#xff0c;初期定位为多媒体编解码工具。2004年后由Michael Niedermayer接任维护&#xff0c;逐步发展成为包含音视频采…

【前端基础】Day 1 HTML

总结&#xff1a; 1. Web标准的构成 2. 基本标签 目录 1. Web标准的构成 2. 基本标签 2.1快捷键 2.2.1标题标签 2.2.2段落和换行标签 2.2.3文本格式化标签 2.2.4div和span标签 2.3.1 图像标签和路径 2.3.2路径 2.3.3超链接标签 2.4注释标签 2.5特殊字符 1. Web标准…

Android Realm数据库使用与集成指南

本地存储storage集成创建Realm数据模型插入和更新数据模型数据查询统计数据分页查询处理表数据删除操作总结Realm 是一款专为移动端和嵌入式场景设计的高性能、跨平台的 对象数据库(NoSQL),由 MongoDB 团队维护。它的核心思想是将数据模型直接映射到对象(如 Java/Kotlin、S…

(九)趣学设计模式 之 桥接模式!

目录 一、 啥是桥接模式&#xff1f;二、 为什么要用桥接模式&#xff1f;三、 桥接模式的实现方式四、 桥接模式的优缺点五、 桥接模式的应用场景六、 总结 &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢博主的讲解方式&#xff0c;可以多多支…

Day8 蓝桥杯acw讲解

首先先给大家看一道这个题&#xff0c; 我真的是太喜欢y总了&#xff0c;如果大家也是最近在准备蓝桥杯或者计算机相关的比赛&#xff0c;但是得加一个前提就是必须最好基础真的很好&#xff0c;要不然其实买了课&#xff0c;也没啥太大的用处&#xff0c;其实就可以以我本人举…