十一 Javascript的按值传递

你将知道:

  • “传递” 值是什么意思
  • 什么是按值传递
  • 传递物品
  • JavaScript 中没有传递引用!


介绍

当需要在 JavaScript 中分配或简单地将一个值传递给其他标识符时,我们就会看到通常所说的 按值传递

严格来说,JavaScript 中传递值的方式只有一种,那就是复制值,这本质上就是所谓的“按值传递”。换句话说,JavaScript 实际上只支持“按值传递” 。

然而在 JavaScript 中,绝对没有办法通过引用传递数据(至少目前是这样)。

‘传递’ 是什么意思?

基本上,每当我们在 JavaScript 中将一个标识符(即变量、常量、属性等)分配给另一个标识符时,我们所做的事情就是传递标识符。传递标识符只是将其分配给另一个标识符。

例如,如果我们有一个变量 x 并将其分配给另一个变量 y ,我们会说我们将变量 x 传递给 y 。类似地,如果我们将变量 x 作为参数提供给函数 f() ,我们再次说我们正在传递变量 x 但这次是传递给函数 f()

什么是按值传递?

按值传递是指通过复制其值来传递标识符。

在按值传递中,传递的标识符中存储的值被复制 ,然后其副本存储在另一个标识符中。

因此,我们说 “按值传递” ,也就是说,我们传递存储的精确值。

var text = 'Hello';
var str = text;text = 'Bye';console.log(str);

那么,代码将记录值 'Hello'

首先,我们定义一个变量 text ,并将其初始化为 'Hello' 。然后,我们将 text 赋值给第二个变量 str 。完成后,我们最终修改 text ,然后输出 str 值。

现在,人们可能会认为,既然 text 已赋值给 str ,那么更改 text 也会导致 str 发生更改;但这并没有发生。这仅仅是因为 JavaScript 中的原语是按值传递的。

当我们将 text 分配给 str 时,将复制存储在 text 中的实际值 (即 'Hello' ,并将副本分配给 str

换句话说,变量 textstr 都有各自独立的 'Hello' 值;改变其中一个不会明显改变另一个。

上面的代码从技术上讲等同于下面的代码:

var str = 'Hello'; // own value
var text = 'Hello'; // own valuetext = 'Bye';console.log(str);

JavaScript 数据类型不只有原始类型,对吧?我们还有对象。现在,对象传递也是按值传递的。

ha?

在 JavaScript 中,对象通过其引用 存储在标识符中 而不是通过其实际值。

引用可以被认为是指向存储对象位置的内存地址。

由于 JavaScript 中的对象通过其引用存储在标识符内,因此当传递该对象时,实际传递的是该引用。

对象是真实的数据;引用是对象在程序中的表示方式

再次强调,需要特别注意的是,对象仍然像 JavaScript 中的原语一样传递,即按值传递;对象唯一的不同之处在于它们的存储方式,即通过引用。

var obj = { x: 10 };
var obj2 = obj;obj.x = 20;console.log(obj2.x);  // 20 

我们首先定义一个变量 obj ,其值为 { x: 10 } 然后定义另一个变量 obj2 ,并将其初始化为 obj

接下来,我们改变 obj 的属性 x ,然后记录 obj2 的相同属性。

obj.xobj2 中可见,仅仅是因为 objobj2 都引用内存中 obj 同一个对象 。obj 和 obj2保存单独的对象 - 它们保存完全相同的对象。

JavaScript 中对象是如何存储的

这是我们的 obj 变量。它包含一个指向内存中对象 { x: 10 } 的值(箭头所示)。这个值就是我们所说的引用。

当我们将 obj 赋值给另一个变量 obj2 时,会发生以下情况:

在 JavaScript 中将对象分配给另一个标识符

obj 中存储的值(引用)仅仅被复制到 obj2 中。因此, obj2 指向(箭头所示) obj 指向的同一个对象 { x: 10 }

如果我们现在继续更改 obj 的属性,就像我们在上面的代码中通过更新属性 x 所做的那样,那么该更改在 obj2 中也会可见。

重申一下:

当我们将 obj 分配给 obj2 时, obj 中存储的实际值 (即引用 )被复制,并将该副本分配给 obj2 。 实际也还是值传递,只是这个值是引用。

从今以后,如果我们改变存储在 obj (或 obj2 )中的对象,这些变化显然也会在 obj2 (或 obj )中可见,因为它们都包含完全相同的对象。

(牢记上面的图)


JavaScript 中没有传递引用!

不能真正在 JavaScript 中通过其引用(在内存中)传递标识符,并期望其他代码能够控制该标识符中存储的内容。

事实上,很容易确认传统意义上的 JavaScript 不支持传递引用。

以上面部分的代码为例,如果我们将任何值重新分配给 objobj2 本身,另一个变量不会发生神奇的变化。

var obj = { x: 10 };
var obj2 = obj; // This is just pass-by-value.obj = 20;console.log(obj2);{ x: 10 }

这里的一切与之前相同,只是现在变量 obj 自身发生了改变(而不是像之前那样改变其属性 x )。然后,直接输出 obj ,而不是输出 obj.x

因为 JavaScript 中没有真正意义上的按引用传递,所以我们在为 obj 分配值时, obj2 不会改变 - 它会继续保留 { x: 10 }

这纯粹是因为没有任何东西将两个变量 objobj2 联系在一起。

简单来说就是,本来他俩的值都是引用,比如 16 位一个引用地址,指向了内存中的{x: 10},所以,当 xxx.x 的时候,才会影响这两个对象,但实际他俩是两个变量,当 obj = 20 的时候, 那就是一个原语,最基础的值 20。那么得到的结果当然就是 obj = 20 , obj2 = {x:10}

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

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

相关文章

SpringBoot ThreadLocal 全局动态变量设置

需求说明: 现有一个游戏后台管理系统,该系统可管理多个大区的数据,但是需要使用大区id实现数据隔离,并且提供了大区选择功能,先择大区后展示对应的数据。需要实现一下几点: 1.前端请求时,area_i…

如何解决pip安装报错ModuleNotFoundError: No module named ‘logging’问题

【Python系列Bug修复PyCharm控制台pip install报错】如何解决pip安装报错ModuleNotFoundError: No module named ‘logging’问题 摘要: 在使用 PyCharm 2025 控制台通过 pip install 安装第三方库时,常会遇到诸如 ModuleNotFoundError: No module name…

打破技术债困境:从“保持现状”到成为变革的推动者

相信许多在科技行业的同行都面临过类似的挑战:明知系统存在“技术债”,却因为沟通成本、团队压力和短期KPI等原因,难以推动改进,最终陷入“想做却不敢做”的矛盾心态。这不仅影响个人心情,更重要的是,它像一…

Spring Boot 整合 RabbitMQ

Spring Boot 整合 RabbitMQ 一、概述:RabbitMQ 是什么? 你可以把 RabbitMQ 想象成一个「快递中转站」。 比如你在网上买了一本书,卖家(生产者)把包裹(消息)交给快递站(RabbitMQ&…

Unity Demo-3DFarm详解-其一

我们来拆解一个种田游戏,这个游戏种类内部的功能还是比较模板化的,我们来一点点说。我们大体上分为这么几个部分:农场运营玩法角色与玩家互动物品与背包存档和进度管理用户界面系统农场运营可以大体上分为:种植系统:支…

esp8266驱动下载

问题描述:esp8266插上电脑,设备管理器无法识别,显示为USB serial(黄色感叹号) 首先确认你的esp8266是不是 CH340 系列的 USB 转串口芯片 CH340驱动下载地址

大语言模型的极限:知识、推理与创造力的边界探析

大语言模型的极限:知识、推理与创造力的边界探析 人工智能领域的快速发展推动了大语言模型(LLM)的广泛应用,这些模型在文本生成、知识问答和创意表达等方面展现出前所未有的能力。然而,随着应用场景的深化,…

git中的fork指令解释

在Git中,Fork 是指将他人的代码仓库(Repository)复制到自己的账户下,创建一个完全独立的副本[1][2]。以下是关于Fork的详细说明: Fork的定义与核心作用 定义:Fork是代码托管平台(如GitHub&#…

iPhone 抓包工具有哪些?多工具对比分析优缺点

iOS 平台一向以安全性著称,这也使得对其进行网络调试和抓包变得异常困难。相比安卓,iPhone 抓包难点主要在以下几点: 系统限制代理设置的灵活性无法自由安装根证书抓包常涉及 HTTPS 解密与双向认证破解普通用户设备无 root 或越狱权限 因此&a…

使用 libcu++ 库

文章目录使用 libcu 库安装与设置基本组件1. 原子操作2. 内存管理3. 类型特性4. 同步原语编译选项注意事项使用 libcu 库 libcu 是 NVIDIA 提供的 CUDA C 标准库实现,它为 CUDA 开发者提供了类似 C 标准库的功能和接口。以下是使用 libcu 的基本指南: …

[Leetcode] 预处理 | 多叉树bfs | 格雷编码 | static_cast | 矩阵对角线

魔术排列模拟一个特定的洗牌过程,并找到使得经过一系列洗牌和取牌操作后,能够与给定的目标数组target相匹配的最小k值核心思想: 预处理初始排列:从一个按顺序排列的数组(例如,{1, 2, 3, ..., n})开始。洗牌…

【技术追踪】SynPo:基于高质量负提示提升无训练少样本医学图像分割性能(MICCAI-2025)

SAM 新用法,无需训练,利用高质量负提示提升分割性能~ 论文:SynPo: Boosting Training-Free Few-Shot Medical Segmentation via High-Quality Negative Prompts 代码:https://liu-yufei.github.io/synpo-project-page/ 0、摘要 大…

深入理解机器学习

一.前言本章节开始来讲解一下机器学习的知识,本期作为一个了解就大概介绍一下,我们不会从机器学习基础开始介绍,但是后面会来补充,随着ai的不断发展,机器学习在ai的领域里面的占比越来约少,我们还是以应用为…

数据结构 顺序表(1)

目录 1.线性表 2.顺序表 1.线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用 的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串… 线性表在逻辑上是线性结构&#…

openssl 生成国密证书

openssl生成证书生成CA私钥 openssl ecparam -genkey -name SM2 -out ca.key.pem -noout证书请求 openssl req -new -key ca.key.pem -out ca.cert.req -subj “/CNrtems-strongswan-CA”生成证书 openssl x509 -req -days 3650 -in ca.cert.req -signkey ca.key.pem -out ca.c…

系统架构设计师论文分享-论分布式事务技术及其应用

我的软考历程 摘要 2023年9月,我所在的公司通过了研发纱线MES系统的立项,该系统为国内纱线工厂提供SAAS服务,旨在提高纱线工厂的数字化和智能化水平。我在该项目中担任系统架构设计师一职,负责该项目的架构设计工作。本文结合我…

东土科技智能塔机系统亮相南京,助力智能建造高质量发展

近日,由南京市城乡建设委员会、江苏省土木建筑学会主办的“无人驾驶智能塔机观摩会”,在中建三局一公司南京扬子江智慧中心项目现场成功举办。作为全国首批智能建造试点城市,南京市已出台20余项支持政策,落地93个试点项目&#xf…

3D Surface Reconstruction with Enhanced High-Frequency Details

3D Surface Reconstruction with Enhanced High-Frequency Details核心问题:当前基于神经隐式表示(如 NeuS)的 3D 表面重建方法,通常采用随机采样策略。这种随机采样难以充分捕捉图像中的高频细节区域(如纹理、边缘、光…

Science Robotics 耶鲁大学开源视触觉新范式,看出机器人柔性手的力感知

摘要:在机器人视触觉传感领域,如何兼顾成本与性能始终是一大挑战。耶鲁大学在《Science Robotics》上发表最新研究,提出了一种“Forces for Free”(F3)新范式。该研究通过观测一个经过特殊优化的开源柔性手&#xff08…

关于java项目中maven的理解

我的理解:maven是java项目的依赖管理工具,通过pom.xml文件配置要下载的依赖,settings.xml配置maven下载的镜像没有就默认在maven中央仓库下载依赖,本地仓库是存储下载好的依赖ai:1. 功能定位局限Maven 不只是依赖管理工具&#xf…