[英]Why number are immutable in Javascript?
我已經閱讀了這里的問題和答案:
但是對我來說為什么數字(原始類型)是不可變的還不夠清楚? 僅僅因為他們創建了一個新的引用但沒有覆蓋該值?
如果在每個assignemt上創建一個新的引用
var x = 5;
x = 1;
在下面的循環中我們會有 100 次新引用嗎?
while (x < 101)
{
x++;
}
這樣有效率嗎? 我想我沒有正確看待。
老實說,我不太確定您期望什么樣的答案,因為我不太明白您對什么感到困惑。 但是我們開始了:
在下面的循環中我們會有 100 次新引用嗎?
變量只是值的容器。 在低級別,變量基本上只是內存地址或寄存器的標簽。 例如變量x
可能指向寄存器R1
。
x++
只會將存儲在該寄存器中的數字增加1
。 讓我們假設我們的寄存器看起來像這樣:
R1: 5
在增加它之后,這可以是一個單一的操作,例如ADD R1 1
,我們會得到
R1: 6
即我們簡單地用一個新的值覆蓋了以前的值。 我們多次這樣做。
這樣有效率嗎? 我想我沒有正確看待。
將數字遞增 1 是一項盡可能簡單的操作。
當然,您可以在更高級別上實現可變數字,但這肯定不會使事情變得更高效或更簡單。
可變性對於“單值”值沒有多大意義,因為改變這樣的值基本上意味着用“就地”不同的值替換它。
可變性對於由其他值(例如列表和字典)組成的值更有意義,其中一部分發生變化而另一部分保持不變。
此外,只有當語言具有引用類型數據類型時,可變性才有意義。 我的意思是多個變量可以保存對數據類型的相同值的引用。 對象是 JavaScript 中的引用類型,它允許您執行以下操作:
var a = {foo: 42}; var b = a; b.foo = 21; console.log(a);
如果數據類型不是引用類型,稱為值類型(JavaScript 中的原始值),那么可變性無關緊要,因為它與不變性無法區分。 考慮以下具有可變值類型數字的假設場景:
var a = MutableNumber(42);
var b = a; // creates a copy of MutableNumber(42) because it's a value type
a.add(1);
console.log(a, b); // would log 43, 42
在這種情況下,不可能對兩個變量來指代相同的可變數值, a.add(1)
是從分配一個新的值,以區分a
(即a = a + 1
)。
我可以理解你的問題,問題是,在 while 循環中,每次 x 將指向新值,而舊值將准備好進行垃圾收集,因此內存仍然保留。
閱讀本文以獲得更好的理解: https : //developer.mozilla.org/en-US/docs/Glossary/Mutable
所以關於可變性,你的理解是正確的,變量引用了新值,舊值沒有改變,因此原始值是不可變的。
參考: https : //developer.mozilla.org/en-US/docs/Glossary/Primitive
突變是狀態的變化,而數字(原始類型)是純狀態對象。 這種“對象”狀態的任何變化實際上都是一個新數字。 數字本身就像是計算機內存單元中位元突變的標識符。
因此數字是不可變的。 與顏色或字符相同。
同樣值得澄清的是,對於任何給定的變量,新數字將與舊數字占據相同的存儲單元。 實際上是替換舊的。 因此,沒有任何形式的性能損失。
我完全不明白這一點,
var a=12;
a=45;
我們可以推斷出;
1.首先解釋器分配一塊內存並將12定位到該區域。 實際上(a)是這個內存區域的標簽。 2.than,解釋器分配一個新的內存單元並將45定位到這個區域。 最后(a)與這個新的存儲單元相關聯。 包含 12 個的內存單元被垃圾收集器銷毀。
在類型為 boolean、undefined、null、number、symbol、string 的 JavaScript 中,值是原始值。 當您將它們分配給變量或將它們作為參數傳遞給函數時,它們總是會被復制。 相比之下,對象有兩個部分:對象(它的數據)存儲在一塊內存中,您分配給變量的是指向該對象的引用。 對象本身在賦值時不會被復制。
因為在將數字分配給變量時總是會復制數字,因此不可能更改數字並通過其他變量查看該更改而不實際為該變量分配新值。 相反,當您更改對象上的字段時,指向該對象的所有變量都會看到該更改。
讓我們看一些例子:
var a = 1;
var b = a; //This creates a new copy of value 1
console.log(a, b); // 1 1
a = 2;
console.log(a, b); // 2 1
var obj_a = {attr: 1};
var obj_b = obj_a; //This makes a new reference to the same object.
console.log(obj_a, obj_b); // {'attr': 1} {'attr': 1}
obj_b.attr = 2;
console.log(obj_a, obj_b); // {'attr': 2} {'attr': 2}
immutable.js 之類的庫提供了結合原始類型和對象屬性的類型: immutable.js 中的類型的行為與普通對象一樣,只要您不更改它們。 當您更改不可變對象的屬性時,會創建一個新對象,並且更改僅通過該新對象可見。 好處是可以節省內存空間,並且可以通過比較對象的引用來快速檢查對象的相等性。 您將獲得一組行為類似於整數的類型,但您可以在其中存儲更復雜的結構。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.