成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaScript引用是如何工作的

hankkin / 822人閱讀

摘要:在中,標(biāo)量原始值是不可變的,復(fù)合值是可變的。當(dāng)修改共享值時(shí),引用將指向更新的值。通過引用來賦值如何創(chuàng)建一個(gè)新的引用當(dāng)變量中的復(fù)合值被重新賦值的時(shí)候,將創(chuàng)建一個(gè)新的引用。因此,變量通過引用更改為變量中的新值。

感謝Naveen Karippai先生允許我翻譯此文章,原文鏈接:https://www.sitepoint.com/how...

摘要:JavaScript中沒有指針,并且JavaScript中的引用與我們通??吹降拇蠖鄶?shù)其他流行編程語言的工作方式不同。在JavaScript中,不可能有一個(gè)變量到另一個(gè)變量的引用。而且,只有復(fù)合值(例如對(duì)象或數(shù)組)可以通過引用來賦值。

整片文章中將使用下列屬于:

標(biāo)量–單個(gè)值或數(shù)據(jù)單元(如整數(shù)、布爾值、字符串)

復(fù)合--由多個(gè)值組成(如數(shù)組、對(duì)象、集合)

原始 - 直接的價(jià)值,而不是對(duì)包含值的東西的引用。
JavaScript的標(biāo)量類型是原語,不像其他一些語言(如Ruby)具有標(biāo)量引用類型。注意,在JavaScript中,標(biāo)量原始值是不可變的,而復(fù)合值是可變的。

概要:

1.分配給變量的值的類型決定該值存儲(chǔ)的是值還是引用。
2.在變量賦值的時(shí)候,標(biāo)量原始值(Number,String,Boolean,undefined,null,Symbol)通過值來賦值,復(fù)合值通過引用來賦值。
3.JavaScript中的引用僅指向包含的值,不指向其他變量或引用。
4.在JavaScript中,標(biāo)量原始值是不可變的,復(fù)合值是可變的。

通過值賦值的快速示例

在下面的代碼片段中,我們將一個(gè)標(biāo)量原始值(一個(gè)數(shù)字)分配給一個(gè)變量,因此這里是通過值來賦值。首先,變量 batman被初始化,當(dāng)變量superman被分配存儲(chǔ)在batman中的值的時(shí)候,實(shí)際上是創(chuàng)建了該值的一個(gè)副本并存儲(chǔ)在變量superman中。當(dāng)變量superman被修改時(shí),變量batman不會(huì)受到影響,因?yàn)樗鼈冎赶虿煌闹怠?/p>

var batman = 7;
var superman = batman;   //通過值來賦值
superman++;
console.log(batman);     //7
console.log(superman);   //8

通過引用賦值的快速示例

在下面的代碼片段中,我們將一個(gè)復(fù)合值(數(shù)組)賦值給一個(gè)變量,因此這里是通過引用賦值。變量flashquicksilver是相同的值(也稱為共享值)的引用。當(dāng)修改共享值時(shí),引用將指向更新的值。

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]

如何創(chuàng)建一個(gè)新的引用

當(dāng)變量中的復(fù)合值被重新賦值的時(shí)候,將創(chuàng)建一個(gè)新的引用。在JavaScript中,與大多數(shù)其他流行的編程語言不同是:引用指向存儲(chǔ)在變量中的值,不指向其他變量或者引用。

var firestorm = [3,6,3];
var atom = firestorm;   //通過引用來賦值
console.log(firestorm); //[3,6,3]
console.log(atom);      //[3,6,3]
atom = [9,0,9];         //通過值來賦值 (創(chuàng)建新的引用)
console.log(firestorm); //[3,6,3]
console.log(atom);      //[9,0,9]

當(dāng)引用作為函數(shù)參數(shù)傳遞時(shí),引用如何工作

在下面的代碼片段中,變量magneto是一個(gè)復(fù)合值(一個(gè)數(shù)組),因此它作為一個(gè)引用被賦值給了變量x(函數(shù)參數(shù))。

在IIFE中調(diào)用的Array.prototype.push方法會(huì)通過JavaScript引用來改變變量中的值。但是,變量x的重新賦值會(huì)創(chuàng)建一個(gè)新的引用,并且對(duì)變量x的進(jìn)一步修改不會(huì)影響到變量magneto的引用。

var magneto = [8,4,8];
(function(x) {        //IIFE
    x.push(99);
    console.log(x);   //[8,4,8,99]
    x = [1,4,1];      //重新賦值變量 (創(chuàng)建一個(gè)新的引用)
    x.push(88);
    console.log(x);   //[1,4,1,88]
})(magneto);
console.log(magneto); //[8,4,8,99]
如何更改作為函數(shù)參數(shù)通過JavaScript引用傳遞的復(fù)合變量中的原始值

這里的解決方案是修改引用指向的現(xiàn)有復(fù)合值。在下面的代碼片段中,變量wolverine是一個(gè)復(fù)合值(一個(gè)數(shù)組)并且在IIFE中被調(diào)用,變量x(函數(shù)參數(shù))是被賦值了一個(gè)引用。

可以通過將屬性Array.prototype.length的值設(shè)置為0來創(chuàng)建一個(gè)空數(shù)組。因此,變量wolverine通過JavaScript引用更改為變量x中的新值。

var wolverine = [8,7,8];
(function(x) {              //IIFE
    x.length = 0;           //創(chuàng)建空數(shù)組對(duì)象
    x.push(1,4,7,2);
    console.log(x);         //[1,4,7,2]
})(wolverine);
console.log(wolverine);     //[1,4,7,2]
如何通過按值賦值來存儲(chǔ)復(fù)合值

這里的解決方案是制作復(fù)合值的手動(dòng)副本,然后將復(fù)制的值分配給變量。因此,分配值的引用不指向原始值。

創(chuàng)建一個(gè)(淺)復(fù)合值副本(數(shù)組對(duì)象)推薦調(diào)用Array.prototype.slice方法,而不傳遞任何參數(shù)。

var cisco = [7,4,7];
var zoom = cisco.slice();  //創(chuàng)建淺復(fù)制
cisco.push(77,33);
console.log(zoom);         //[7,4,7]
console.log(cisco);        //[7,4,7,77,33]

如何通過按引用賦值來存儲(chǔ)一個(gè)標(biāo)量初始值

這里的解決方案是將標(biāo)量原始值包含在復(fù)合值(即對(duì)象或數(shù)組)中作為其屬性值。因此,它可以通過引用來賦值。在下面的代碼片段中,變量speed中的標(biāo)量原始值設(shè)置為flash對(duì)象的屬性。因此,在調(diào)用IIFE的時(shí)候,它通過引用賦值給了x(函數(shù)參數(shù))。

var flash = { speed: 88 };
(function (x) {             //IIFE
    x.speed = 55;
})(flash);
console.log(flash.speed);   //55
總結(jié)

很好地理解JavaScript中的引用可以幫助開發(fā)人員避免許多常見的錯(cuò)誤,并編寫出更好的代碼。

編碼快樂!!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/88235.html

相關(guān)文章

  • JavaScript 如何工作JavaScript 共享傳遞和按值傳遞

    摘要:它對(duì)數(shù)組和對(duì)象使用按值傳遞,但這是在的共享傳參或拷貝的引用中使用的按值傳參。例如在這里,變量和值在執(zhí)行期間存儲(chǔ)在堆棧中。返回值這是可選的,函數(shù)可以返回值,也可以不返回值。變量被推入堆棧,從而在執(zhí)行時(shí)成為的副本。 這是專門探索 JavaScript 及其所構(gòu)建的組件的系列文章的第 22 篇。 想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳GitHub博客,一年百來篇優(yōu)質(zhì)文章等著你! 如果你錯(cuò)過了前面的章節(jié),可...

    keithyau 評(píng)論0 收藏0
  • JavaScript 如何工作JavaScript 共享傳遞和按值傳遞

    摘要:它對(duì)數(shù)組和對(duì)象使用按值傳遞,但這是在的共享傳參或拷貝的引用中使用的按值傳參。例如在這里,變量和值在執(zhí)行期間存儲(chǔ)在堆棧中。返回值這是可選的,函數(shù)可以返回值,也可以不返回值。變量被推入堆棧,從而在執(zhí)行時(shí)成為的副本。 這是專門探索 JavaScript 及其所構(gòu)建的組件的系列文章的第 22 篇。 想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳GitHub博客,一年百來篇優(yōu)質(zhì)文章等著你! 如果你錯(cuò)過了前面的章節(jié),可...

    陳偉 評(píng)論0 收藏0
  • 【譯】JavaScript如何工作:內(nèi)存管理 + 如何處理4個(gè)常見內(nèi)存泄露

    摘要:本文作為第三篇,將會(huì)討論另一個(gè)開發(fā)者容易忽視的重要主題內(nèi)存管理。我們也會(huì)提供一些關(guān)于如何處理內(nèi)存泄露的技巧。這是當(dāng)前整型和雙精度的大小。然而,這是一組可以收集的內(nèi)存空間的近似值。 本文轉(zhuǎn)載自:眾成翻譯譯者:Leslie Wang審校: 為之漫筆鏈接:http://www.zcfy.cc/article/4211原文:https://blog.sessionstack.com/how-j...

    IntMain 評(píng)論0 收藏0
  • JavaScript如何工作:內(nèi)存管理+如何處理4個(gè)常見內(nèi)存泄漏

    摘要:本系列的第一篇文章簡(jiǎn)單介紹了引擎運(yùn)行時(shí)間和堆棧的調(diào)用。編譯器將插入與操作系統(tǒng)交互的代碼,并申請(qǐng)存儲(chǔ)變量所需的堆棧字節(jié)數(shù)。當(dāng)函數(shù)調(diào)用其他函數(shù)時(shí),每個(gè)函數(shù)在調(diào)用堆棧時(shí)獲得自己的塊。因此,它不能為堆棧上的變量分配空間。 本系列的第一篇文章簡(jiǎn)單介紹了引擎、運(yùn)行時(shí)間和堆棧的調(diào)用。第二篇文章研究了谷歌V8 JavaScript引擎的內(nèi)部機(jī)制,并介紹了一些編寫JavaScript代碼的技巧。 在這第...

    anRui 評(píng)論0 收藏0
  • JavaScript 如何工作JavaScript 內(nèi)存模型

    摘要:調(diào)用堆棧是存放原始數(shù)據(jù)類型的地方除了函數(shù)調(diào)用之外。上一節(jié)中聲明變量后調(diào)用堆棧的粗略表示如下。解釋改變的正確方法是更改內(nèi)存地址。在聲明時(shí),將在調(diào)用堆棧上分配內(nèi)存地址,該值是在堆上分配的內(nèi)存地址。 這是專門探索 JavaScript 及其所構(gòu)建的組件的系列文章的第 21 篇。 想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳GitHub博客,一年百來篇優(yōu)質(zhì)文章等著你! 如果你錯(cuò)過了前面的章節(jié),可以在這里找到它們:...

    baoxl 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

hankkin

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<