十一 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
英文地址,請注明出處:http://en.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…