摘要:在中,標量原始值是不可變的,復合值是可變的。當修改共享值時,引用將指向更新的值。通過引用來賦值如何創建一個新的引用當變量中的復合值被重新賦值的時候,將創建一個新的引用。因此,變量通過引用更改為變量中的新值。
感謝Naveen Karippai先生允許我翻譯此文章,原文鏈接:https://www.sitepoint.com/how...
摘要:JavaScript中沒有指針,并且JavaScript中的引用與我們通??吹降拇蠖鄶灯渌餍芯幊陶Z言的工作方式不同。在JavaScript中,不可能有一個變量到另一個變量的引用。而且,只有復合值(例如對象或數組)可以通過引用來賦值。
概要:整片文章中將使用下列屬于:
標量–單個值或數據單元(如整數、布爾值、字符串)
復合--由多個值組成(如數組、對象、集合)
原始 - 直接的價值,而不是對包含值的東西的引用。
JavaScript的標量類型是原語,不像其他一些語言(如Ruby)具有標量引用類型。注意,在JavaScript中,標量原始值是不可變的,而復合值是可變的。
1.分配給變量的值的類型決定該值存儲的是值還是引用。
2.在變量賦值的時候,標量原始值(Number,String,Boolean,undefined,null,Symbol)通過值來賦值,復合值通過引用來賦值。
3.JavaScript中的引用僅指向包含的值,不指向其他變量或引用。
4.在JavaScript中,標量原始值是不可變的,復合值是可變的。
在下面的代碼片段中,我們將一個標量原始值(一個數字)分配給一個變量,因此這里是通過值來賦值。首先,變量 batman被初始化,當變量superman被分配存儲在batman中的值的時候,實際上是創建了該值的一個副本并存儲在變量superman中。當變量superman被修改時,變量batman不會受到影響,因為它們指向不同的值。
var batman = 7; var superman = batman; //通過值來賦值 superman++; console.log(batman); //7 console.log(superman); //8通過引用賦值的快速示例
在下面的代碼片段中,我們將一個復合值(數組)賦值給一個變量,因此這里是通過引用賦值。變量flash和quicksilver是相同的值(也稱為共享值)的引用。當修改共享值時,引用將指向更新的值。
var flash = [8,8,8]; var quicksilver = flash; //通過引用來賦值 quicksilver.push(0); console.log(flash); //[8,8,8,0] console.log(quicksilver); //[8,8,8,0]如何創建一個新的引用
當變量中的復合值被重新賦值的時候,將創建一個新的引用。在JavaScript中,與大多數其他流行的編程語言不同是:引用指向存儲在變量中的值,不指向其他變量或者引用。
var firestorm = [3,6,3]; var atom = firestorm; //通過引用來賦值 console.log(firestorm); //[3,6,3] console.log(atom); //[3,6,3] atom = [9,0,9]; //通過值來賦值 (創建新的引用) console.log(firestorm); //[3,6,3] console.log(atom); //[9,0,9]當引用作為函數參數傳遞時,引用如何工作
在下面的代碼片段中,變量magneto是一個復合值(一個數組),因此它作為一個引用被賦值給了變量x(函數參數)。
在IIFE中調用的Array.prototype.push方法會通過JavaScript引用來改變變量中的值。但是,變量x的重新賦值會創建一個新的引用,并且對變量x的進一步修改不會影響到變量magneto的引用。
var magneto = [8,4,8]; (function(x) { //IIFE x.push(99); console.log(x); //[8,4,8,99] x = [1,4,1]; //重新賦值變量 (創建一個新的引用) x.push(88); console.log(x); //[1,4,1,88] })(magneto); console.log(magneto); //[8,4,8,99]如何更改作為函數參數通過JavaScript引用傳遞的復合變量中的原始值
這里的解決方案是修改引用指向的現有復合值。在下面的代碼片段中,變量wolverine是一個復合值(一個數組)并且在IIFE中被調用,變量x(函數參數)是被賦值了一個引用。
可以通過將屬性Array.prototype.length的值設置為0來創建一個空數組。因此,變量wolverine通過JavaScript引用更改為變量x中的新值。
var wolverine = [8,7,8]; (function(x) { //IIFE x.length = 0; //創建空數組對象 x.push(1,4,7,2); console.log(x); //[1,4,7,2] })(wolverine); console.log(wolverine); //[1,4,7,2]如何通過按值賦值來存儲復合值
這里的解決方案是制作復合值的手動副本,然后將復制的值分配給變量。因此,分配值的引用不指向原始值。
創建一個(淺)復合值副本(數組對象)推薦調用Array.prototype.slice方法,而不傳遞任何參數。
var cisco = [7,4,7]; var zoom = cisco.slice(); //創建淺復制 cisco.push(77,33); console.log(zoom); //[7,4,7] console.log(cisco); //[7,4,7,77,33]如何通過按引用賦值來存儲一個標量初始值
這里的解決方案是將標量原始值包含在復合值(即對象或數組)中作為其屬性值。因此,它可以通過引用來賦值。在下面的代碼片段中,變量speed中的標量原始值設置為flash對象的屬性。因此,在調用IIFE的時候,它通過引用賦值給了x(函數參數)。
var flash = { speed: 88 }; (function (x) { //IIFE x.speed = 55; })(flash); console.log(flash.speed); //55總結
很好地理解JavaScript中的引用可以幫助開發人員避免許多常見的錯誤,并編寫出更好的代碼。
編碼快樂!!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/88235.html
摘要:它對數組和對象使用按值傳遞,但這是在的共享傳參或拷貝的引用中使用的按值傳參。例如在這里,變量和值在執行期間存儲在堆棧中。返回值這是可選的,函數可以返回值,也可以不返回值。變量被推入堆棧,從而在執行時成為的副本。 這是專門探索 JavaScript 及其所構建的組件的系列文章的第 22 篇。 想閱讀更多優質文章請猛戳GitHub博客,一年百來篇優質文章等著你! 如果你錯過了前面的章節,可...
摘要:它對數組和對象使用按值傳遞,但這是在的共享傳參或拷貝的引用中使用的按值傳參。例如在這里,變量和值在執行期間存儲在堆棧中。返回值這是可選的,函數可以返回值,也可以不返回值。變量被推入堆棧,從而在執行時成為的副本。 這是專門探索 JavaScript 及其所構建的組件的系列文章的第 22 篇。 想閱讀更多優質文章請猛戳GitHub博客,一年百來篇優質文章等著你! 如果你錯過了前面的章節,可...
摘要:本文作為第三篇,將會討論另一個開發者容易忽視的重要主題內存管理。我們也會提供一些關于如何處理內存泄露的技巧。這是當前整型和雙精度的大小。然而,這是一組可以收集的內存空間的近似值。 本文轉載自:眾成翻譯譯者:Leslie Wang審校: 為之漫筆鏈接:http://www.zcfy.cc/article/4211原文:https://blog.sessionstack.com/how-j...
摘要:本系列的第一篇文章簡單介紹了引擎運行時間和堆棧的調用。編譯器將插入與操作系統交互的代碼,并申請存儲變量所需的堆棧字節數。當函數調用其他函數時,每個函數在調用堆棧時獲得自己的塊。因此,它不能為堆棧上的變量分配空間。 本系列的第一篇文章簡單介紹了引擎、運行時間和堆棧的調用。第二篇文章研究了谷歌V8 JavaScript引擎的內部機制,并介紹了一些編寫JavaScript代碼的技巧。 在這第...
摘要:調用堆棧是存放原始數據類型的地方除了函數調用之外。上一節中聲明變量后調用堆棧的粗略表示如下。解釋改變的正確方法是更改內存地址。在聲明時,將在調用堆棧上分配內存地址,該值是在堆上分配的內存地址。 這是專門探索 JavaScript 及其所構建的組件的系列文章的第 21 篇。 想閱讀更多優質文章請猛戳GitHub博客,一年百來篇優質文章等著你! 如果你錯過了前面的章節,可以在這里找到它們:...
閱讀 3226·2021-11-12 10:36
閱讀 1301·2019-08-30 15:56
閱讀 2453·2019-08-30 11:26
閱讀 563·2019-08-29 13:00
閱讀 3622·2019-08-28 18:08
閱讀 2761·2019-08-26 17:18
閱讀 1913·2019-08-26 13:26
閱讀 2441·2019-08-26 11:39