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); // 输出: truelet obj3 = { name: "Alice" };
    console.log(obj1 === obj3); // 输出: false

常见用法

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

实际应用案例

案例1:简单类型的比较

let num1 = 10;
let num2 = 10;
console.log(num1 === num2); // 输出: truelet 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); // 输出: falselet 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

结语

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2.2logstash规则配置

工作流程 Logstash工作的三个阶段: input数据输入端,以接收来自任何地方的源数据 * file:从文件中读取 * syslog:监听在514端口的系统日志信息, 并解析成RFC3164格式 * redis:从redis-server list中获取 * beat&a…

Java进阶:Zookeeper相关笔记

概要总结: ●Zookeeper是一个开源的分布式协调服务,需要下载并部署在服务器上(使用cmd启动,windows与linux都可用)。 ●zookeeper一般用来实现诸如数据订阅/发布、负载均衡、命名服务、集群管理、分布式锁和分布式队列等功能。 ●有多台服…

GB 44497-2024《智能网联汽车 自动驾驶数据记录系统》标准解读

GB 44497-2024《智能网联汽车 自动驾驶数据记录系统》是由工业和信息化部提出并归口的强制性国家标准,由国家市场监督管理总局、国家标准化管理委员会于2024年8月23日批准发布(国家标准公告2024年第18号文),将于2026年1月1日起实施。标准规定了智能网联汽…

在低功耗MCU上实现人工智能和机器学习

作者:Silicon Labs 人工智能(AI)和机器学习(ML)技术不仅正在快速发展,还逐渐被创新性地应用于低功耗的微控制器(MCU)中,从而实现边缘AI/ML解决方案。这些MCU是许多嵌入式…

[数据结构笔记]数据结构必要的C语言基础

数据结构必要的C语言基础 使用C语言学习数据结构之前有一些必要了解的基础,许多同学在初学数据结构时因为对这些知识不熟,导致了对数据结构的畏惧心理。实际上很大一部分来自C语言的基础 C语言 结构体与指针 ​ 在一些场景中,如果传递给函…

Java进阶(一)

文章目录 前言一、常用类 1.Object类常用方法 toString方法equals方法fianlize()方法 2. String类 String字符串的储存原理内存图分析String常用的构造方法String常用方法3. StringBuilder/StringBuffer类 4. 基本类型包装类 简介包装类类的常用方法(以Integer为例…

蓝桥杯单片机组第十二届省赛第二批次

前言 第十二届省赛涉及知识点:NE555频率数据读取,NE555频率转换周期,PCF8591同时测量光敏电阻和电位器的电压、按键长短按判断。 本试题涉及模块较少,题目不难,基本上准备充分的都能完整的实现每一个功能,并…

微信小程序调用火山方舟(字节跳动火山引擎)中的DeepSeek大模型

一、注册火山引擎账号,创建API Key和model(接入点ID) 1.注册并登陆火山引擎账号,网址为:https://console.volcengine.com/ 2.根据登陆后的页面提示进行实名认证,实名认证后才能创建API Keyt和创建接入点。…

全星FMEA软件系统是一款高效、智能的失效模式及影响分析工具,广泛应用于汽车、电子、机械等行业

全星FMEA软件系统是一款高效、智能的失效模式及影响分析工具,广泛应用于汽车、电子、机械等行业。该系统基于2019版FMEA手册开发,严格遵循七步方法,能够全面识别潜在风险并提前制定应对措施。 全星FMEA软件系统功能特点 自动化分析&#xff…

ROS的action通信——实现阶乘运算(一)

在ROS中除了常见的话题(topic)通信、服务(server)通信等方式,还有action通信这一方式,由于可以实时反馈任务完成情况,该通信方式被广泛运用于机器人导航等任务中。本文将通过三个小节的分享,实现基于action通信的阶乘运…

一文读懂什么是K8s Admission Controller

#作者:曹付江 文章目录 1、什么是 Admission Controllers?2、如何创建 Admission Controllers?3、Admission 控制器的最佳实践 K8s 中的操作与安全标准执行机制: 1、什么是 Admission Controllers? Admission contro…

vue3:vue3项目安装并引入Element-plus

一、安装Element-plus 1、安装语句位置 安装 | Element Plushttps://element-plus.org/zh-CN/guide/installation.html根据所需进行安装,这里使用npm包 2、找到项目位置 找到项目位置,在路径上输入cmd回车打开“运行”窗口 输入安装语句回车完成安装 …

【C/C++】理解C++内存与Linux虚拟地址空间的关系---带你通透C++中所有数据

每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry” 绪论: 本质编写的原因是我在复习过程中突然发现虚拟地址空间和C内存划分我好想有点分不清时,进行查询各类资料和整理各类文章后得出的文章&#xff…

美国国防部(DoD)SysML v2迁移指南项目

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 分享一篇SysML v1向SysML v2迁移的资料。 下载地址:https://ndia.dtic.mil/wp-content/uploads/2023/systems/Thurs_1560710_Stirk.pdf 核心内容用DeepSeek整理如下&#…

在vscode中编译运行c语言文件,配置并运行OpenMP多线程并行程序设计

1.下载安装vscode Visual Studio Code - Code Editing. Redefined 2.安装vscode扩展 打开vscode,按ctrl+shift+x,打开扩展,搜索c/c++,下载相应的扩展 3.下载MinGW-w64 MinGW-w64 提供了 GNU 编译器集合,可以编译c/c++文件 这里下载见我的资源,可直接下载 把压缩包解压…

Jenkins protoc: command not found

个人博客地址:Jenkins protoc: command not found | 一张假钞的真实世界 在使用Jenkins编译Hadoop3.1.2时报错信息如下: [INFO] --- hadoop-maven-plugins:3.1.2:protoc (compile-protoc) hadoop-common --- [WARNING] [protoc, --version] failed: j…

Linux红帽:RHCSA认证知识讲解(二)配置网络与登录本地远程Linux主机

Linux红帽:RHCSA认证知识讲解(二)配置网络与登录本地远程Linux主机 前言一、使用命令行(nmcli 命令)配置网络,配置主机名第一步第二步修改主机名称 二、使用图形化界面(nmtui 命令)配…

【CMake 教程】基础使用教程(一)

一、准备 1. CMake 官方下载网址 2. 文件目录结构 MySimpleProject ├── CMakeLists.txt # CMake 配置文件 └── main.cpp # 主程序源码我们在 MySimpleProject 目录中创建 CMakeLists.txt 和 main.cpp 两个空白文件。 二、CMake 简单概念 要学会使用 CMake&#xff…

智能网络感知,打造极致流畅的鸿蒙原生版中国移动云盘图文体验

背景 中国移动云盘(原“和彩云网盘”)是中国移动重磅推出的安全、智能、不限速、移动用户免流的智能云盘,致力于成为5G时代用户个人与家庭的数字资产管理中心,是中国移动继语音、短信、流量后的“第四项基础服务”。 照片、音视…

Windows 11【1001问】Windows 11系统硬件配置要求

Windows 11 的设计目标是让用户更贴近自己喜欢的内容,在其发布之际,计算机在连接、创作以及游戏体验方面扮演了更加核心的角色。在设定 Windows 11 的最低系统要求时,我们依据三个关键原则来指导决策,以确保用户能够获得卓越的使用…