JavaScript 原始值和引用值在變量復制時的異同

相比于其他語言,JavaScript 中的變量可謂獨樹一幟。正如 ECMA-262 所規定的,JavaScript 變量是松散類型的,而且變量不過就是特定時間點一個特定值的名稱而已。由于沒有規則定義變量必須包含什么數據類型,變量的值和數據類型在腳本生命期內可以改變。這樣的變量很有意思,很強大,當然也有不少問題。

? JavaScript 變量可以保存兩種類型的值:原始值和引用值。

? 原始值可能是以下 6 種原始數據類型之 一:Undefined、Null、Boolean、Number、String 和 Symbol。

? 原始值和引用值有以下特點。

  • 原始值
    • 大小固定,因此保存在棧內存上。
    • 從一個變量到另一個變量復制原始值會創建該值的第二個副本。
    • typeof 操作符可以確定值的原始類型。
  • 引用值
    • 是對象,存儲在堆內存上。
    • 包含引用值的變量實際上只包含指向相應對象的一個指針,而不是對象本身。
    • 從一個變量到另一個變量復制引用值只會復制指針,因此結果是兩個變量都指向同一個對象。
    • 而 instanceof 操作符用于確保值的引用類型。

原始值與引用值

? ECMAScript 變量可以包含兩種不同類型的數據:原始值和引用值。原始值(primitive value)就是最簡單的數據,引用值(reference value)則是由多個值構成的對象。

? 在把一個值賦給變量時,JavaScript 引擎必須確定這個值是原始值還是引用值。

? 有6 種 原始值:Undefined、Null、Boolean、Number、String 和 Symbol。保存原始值的變量是按值(by value)訪問的,因為我們操作的就是存儲在變量中的實際值。

? 引用值是保存在內存中的對象。與其他語言不同,JavaScript 不允許直接訪問內存位置,因此也就不能直接操作對象所在的內存空間。在操作對象時,實際上操作的是對該對象的引用(reference)而非實際的對象本身。為此,保存引用值的變量是按引用(by reference)訪問的。

動態屬性

? 原始值和引用值的定義方式很類似,都是創建一個變量,然后給它賦一個值。不過,在變量保存了這個值之后,可以對這個值做什么,則大有不同。

? 對于引用值而言,可以隨時添加、修改和刪除其屬性和方法。比如,看下面的例子:

let person = new Object(); 
person.name = "Nicholas"; 
console.log(person.name); // "Nicholas" 

? 這里,首先創建了一個對象,并把它保存在變量 person 中。然后,給這個對象添加了一個名為name 的屬性,并給這個屬性賦值了一個字符串"Nicholas"。在此之后,就可以訪問這個新屬性,直到對象被銷毀或屬性被顯式地刪除。

? 原始值不能有屬性,盡管嘗試給原始值添加屬性不會報錯。比如:

let name = "Nicholas"; 
name.age = 27; 
console.log(name.age); // undefined

? 在此,代碼想給字符串 name 定義一個 age 屬性并給該屬性賦值 27。緊接著在下一行,屬性不見了。記住,只有引用值可以動態添加后面可以使用的屬性。

注意:原始類型的初始化可以只使用原始字面量形式。如果使用的是 new 關鍵字,則 JavaScript 會創建一個 Object 類型的實例,但其行為類似原始值。下面來看看這兩種初始化方式的差異:

let name1 = "Nicholas"; 
let name2 = new String("Matt"); name1.age = 27; 
name2.age = 26; console.log(name1.age); // undefined 
console.log(name2.age); // 26 console.log(typeof name1); // string 
console.log(typeof name2); // object 

復制值

? 除了存儲方式不同,原始值和引用值在通過變量復制時也有所不同。在通過變量把一個原始值賦值到另一個變量時,原始值會被復制到新變量的位置。請看下面的例子:

let num1 = 5; 
let num2 = num1;

? 這里,num1 包含數值 5。當把 num2 初始化為 num1 時,num2 也會得到數值 5。這個值跟存儲在 num1 中的 5 是完全獨立的,因為它是那個值的副本。 這兩個變量可以獨立使用,互不干擾。這個過程如下圖所示。

在這里插入圖片描述

? 在把引用值從一個變量賦給另一個變量時,存儲在變量中的值也會被復制到新變量所在的位置。區別在于,這里復制的值實際上是一個指針,它指向存儲在堆內存中的對象。操作完成后,兩個變量實際上指向同一個對象,因此一個對象上面的變化會在另一個對象上反映出來,如下面的例子所示:

let obj1 = new Object(); 
let obj2 = obj1; 
obj1.name = "hello"; 
console.log(obj2.name); // "hello" 

? 在這個例子中,變量 obj1 保存了一個新對象的實例。然后,這個值被復制到 obj2,此時兩個變量都指向了同一個對象。在給 obj1 創建屬性 name 并賦值后,通過 obj2 也可以訪問這個屬性,因為它們都指向同一個對象。下圖展示了變量與堆內存中對象之間的關系。

時兩個變量都指向了同一個對象。在給 obj1 創建屬性 name 并賦值后,通過 obj2 也可以訪問這個屬性,因為它們都指向同一個對象。下圖展示了變量與堆內存中對象之間的關系。

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/697502.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/697502.shtml
英文地址,請注明出處:http://en.pswp.cn/news/697502.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mysql.service is not a native service, redirecting to systemd-sysv-install

字面意思:mysql.service不是本機服務,正在重定向到systemd sysv安裝 在CentOS上使用Systemd管理MySQL服務的具體步驟如下: 1、創建MySQL服務單元文件: 首先,你需要創建一個Systemd服務單元文件,以便Syste…

【Python筆記-設計模式】原型模式

一、說明 原型模式是一種創建型設計模式, 用于創建重復的對象,同時又能保證性能。 使一個原型實例指定了要創建的對象的種類,并且通過拷貝這個原型來創建新的對象。 (一) 解決問題 主要解決了對象的創建與復制過程中的性能問題。主要針對…

redhawk:使用ipf文件反標instance power

我正在「拾陸樓」和朋友們討論有趣的話題,你?起來吧? 拾陸樓知識星球入口 往期文章鏈接: Redhawk:Input Data Preparation 使用ptpx和redhawk報告功耗時差別總是很大,如果需要反標top/block的功耗值可以在gsr文件中使用BLOCK_POWER_FOR_SCALING的命令

Verilog刷題筆記35

題目: Create a 1-bit wide, 256-to-1 multiplexer. The 256 inputs are all packed into a single 256-bit input vector. sel0 should select in[0], sel1 selects bits in[1], sel2 selects bits in[2], etc. 解法: module top_module( input [255:…

Spring Cloud Alibaba-05-Gateway網關-02-斷言(Predicate)使用

Lison <dreamlison163.com>, v1.0.0, 2023.10.20 Spring Cloud Alibaba-05-Gateway網關-02-斷言(Predicate)使用 文章目錄 Spring Cloud Alibaba-05-Gateway網關-02-斷言(Predicate)使用通過時間匹配通過 Cookie 匹配通過 Header 匹配通過 Host 匹配通過請求方式匹配通…

C# CAD2016 cass10宗地Xdata數據寫入

一、 查看cass10寫入信息 C# Cad2016二次開發獲取XData信息&#xff08;二&#xff09; 一共有81條數據 XData value: QHDM XData value: 121321 XData value: SOUTH XData value: 300000 XData value: 141121JC10720 XData value: 權利人 XData value: 0702 XData value: YB…

2.居中方式總結

居中方式總結 經典真題 怎么讓一個 div 水平垂直居中 盒子居中 首先題目問到了如何進行居中&#xff0c;那么居中肯定分 2 個方向&#xff0c;一個是水平方向&#xff0c;一個是垂直方向。 水平方向居中 水平方向居中很簡單&#xff0c;有 2 種常見的方式&#xff1a; 設…

java面試題之mybatis篇

什么是ORM&#xff1f; ORM&#xff08;Object/Relational Mapping&#xff09;即對象關系映射&#xff0c;是一種數據持久化技術。它在對象模型和關系型數據庫直接建立起對應關系&#xff0c;并且提供一種機制&#xff0c;通過JavaBean對象去操作數據庫表的數據。 MyBatis通過…

MATLAB練習題:randperm函數的練習題

?講解視頻&#xff1a;可以在bilibili搜索《MATLAB教程新手入門篇——數學建模清風主講》。? MATLAB教程新手入門篇&#xff08;數學建模清風主講&#xff0c;適合零基礎同學觀看&#xff09;_嗶哩嗶哩_bilibili MATLAB中有一個非常有用的函數&#xff1a;randperm函數&…

華為算法題 go語言或者ptython

1 給定一個整數數組 nums 和一個整數目標值 target&#xff0c;請你在該數組中找出 和為目標值 target 的那 兩個 整數&#xff0c;并返回它們的數組下標。 你可以假設每種輸入只會對應一個答案。但是&#xff0c;數組中同一個元素在答案里不能重復出現。 你可以按任意順序返…

如何進行高性能架構的設計

一、前端優化 減少請求次數頁面靜態化邊緣計算 增加緩存控制&#xff1a;請求頭 減少圖像請求次數&#xff1a;多張圖片變成 一張。 減少腳本的請求次數&#xff1a;css和js壓縮&#xff0c;將多個文件壓縮成一個文件。 二、頁面靜態化 三、邊緣計算 后端優化 從三個方面進…

adb-monkey命令

目錄 adb shell monkey -p/-v 包名 次數 1、指定一個包 2、指定多個包 3、不指定包 Event percentages&#xff08;事件百分比&#xff09; 常見參數 --throttle 延遲時間 單位毫秒 --pct-touch 設定觸屏事件生成的百分比 --pct-motion 設定滑動事件生成…

面試前端性能優化八股文十問十答第二期

面試前端性能優化八股文十問十答第二期 作者&#xff1a;程序員小白條&#xff0c;個人博客 相信看了本文后&#xff0c;對你的面試是有一定幫助的&#xff01;關注專欄后就能收到持續更新&#xff01; ?點贊?收藏?不迷路&#xff01;? 1&#xff09;如何優化動畫&#x…

c語言中的大小寫字母轉換怎么轉?

在C語言中&#xff0c;大小寫字母轉換是基于ASCII碼表的特性實現的。ASCII碼中&#xff0c;小寫字母從’a’到’z’的ASCII碼值是連續的&#xff08;97到122&#xff09;&#xff0c;而大寫字母從’A’到’Z’的ASCII碼值也是連續的&#xff08;65到90&#xff09;。它們之間有…

Redis高性能原理

redis大家都知道擁有很高的性能&#xff0c;每秒可以支持上萬個請求&#xff0c;這里探討下它高性能的原理。單線程架構和io多路復用技術。 一&#xff0c;單線程架構 單線程架構指的是命令執行核心線程是單線程的&#xff0c;數據持久化、同步、異步刪除是其他線程在跑的。re…

獲取視頻第一幀,以及后續上傳

// 獲取視頻基本信息 const getVideoBasicInfo (videoSrc) > {return new Promise((resolve, reject) > {const video document.createElement("video");video.src videoSrc;// 視頻一定要添加預加載video.preload "auto";// 視頻一定要同源或者…

什么是系統工程(字幕)35

0 00:00:01,190 --> 00:00:02,840 下面的內容 1 00:00:04,850 --> 00:00:06,520 接下來呢就是 2 00:00:08,180 --> 00:00:09,830 16.6.1 3 00:00:11,070 --> 00:00:13,440 項流熱平衡分析 4 00:00:15,350 --> 00:00:16,730 這一節 5 00:00:18,860 --> 0…

億道丨三防平板丨加固平板丨三防加固平板丨改善資產管理

庫存資產管理中最重要的部分之一是準確性&#xff1b;過時的庫存管理技術會增加運輸過程中人為錯誤、物品丟失或紙張損壞的風險。如今隨著三防平板電腦的廣泛使用&#xff0c;庫存管理也迎來了好幫手&#xff0c;通過使用三防平板電腦能夠確保庫存管理、數據存儲和記錄保存的準…

React18源碼: React調度中的3種優先級類型和Lane的位運算

優先級類型 React內部對于優先級的管理&#xff0c;貫穿運作流程的4個階段&#xff08;從輸入到輸出&#xff09;&#xff0c;根據其功能的不同&#xff0c;可以分為3種類型&#xff1a; 1 &#xff09;fiber優先級(LanePriority) 位于 react-reconciler包&#xff0c;也就是L…

掌握 Android 中的 RecyclerView 優化

掌握 Android 中的 RecyclerView 優化 一、RecyclerView Pool以及何時使用它二、onCreateViewHolder 和 onBindViewHolder三、優化 RecyclerView 的不同方法四、視圖無效與請求布局五、ViewHolder模式六、默認的廢料和臟視圖類型七、結論 RecyclerView 是 Android 中一個功能強…