2017-09-28 29 views
1

在閱讀Promises/A+規範時,我遇到了「深度不變性」這個術語。文中說:什麼是深度不變性?

在這裏,「不能改變」是指不可變的身份(即===),但並不意味着深不可變的性。

什麼是深不變性? 有人可以用一個例子來解釋嗎?

+0

你必須考慮'==='如何工作,以及它如何確定兩件事是否相等。 –

+1

或者看看'const'是如何工作的。 'const'值具有不變的身份,但不是很不可變的。 – Tex

回答

2

一旦承諾解決了,再次解決該問題的任何嘗試都將不起作用,這意味着解析後的值始終與原始解析值具有嚴格的相等性。然而,這並不意味着該值不能改變,即「並不意味着深度不變性」

這可以用一個例子來說明:

var value = [1]; 
var p = Promise.resolve(value); 
p.then(a => console.log(a));     // [1] 
p.then(a => console.log(a === value));  // true 

p.then(a => { a = [2]; console.log(a);});  // [2] 
p.then(a => console.log(a));     // [1] 

p.then(a => { a[0] = 2; console.log(a);}); // [2] 
p.then(a => console.log(a));     // [2] 
p.then(a => console.log(a === value));  // true 

正如你可以看到從解決承諾返回的值始終保持同一目標的價值 - a === value。嘗試將對象綁定到不同的值僅適用於then塊的範圍內,並且我們在下次調用promise上的then方法時看到原始Object值。

當我們改變這個數組的屬性之一的值時(在這個例子中是第一個元素),我們注意到這個改變影響了原始值,因此也影響了從這個promise中返回的解析值。如果解決的值具有很強的不變性,那麼它的所有屬性和它們的屬性都是不變的,但是我們剛纔已經證明情況並非如此。

+0

很好的答案和非常有用的例子!你能否解釋一下這個問題:「一旦承諾解決了,任何試圖解決它的嘗試都將無效」?這聽起來像它可能與深度不變性無關,實際上是Promises/A +規範的另一部分。但也許我誤解了? – BillyBBone

+0

這解釋了爲什麼您總是會收到來自承諾的原始對象值,因爲它無法解析爲其他值,以及爲什麼他們使用術語「不得更改」。這種措辭可能會被誤解爲意味深度不變性,這就是它的相關性,以及規範爲何澄清它不是。 – Joel

1

在面向對象的語言中,沒有好方法來鎖定對象的屬性。例如,如果您的應用程序中有一個對象的多個實例,並且您在其中一個引用上更改了屬性值,則該對象的至少一個引用之間的數據現在會有所不同。 Deeply Immutable可確保該對象的數據在所有引用中按規範保持鎖定,以編程方式鎖定。

如果應用程序規範聲明瞭深度不變性,那麼對對象進行變異或重新分配其字段將是非法的。

如果應用程序狀態淺不變性,您仍然不能重新分配對象字段,因此不可變,但您可以改變對象引用。

有這個這裏https://homes.cs.washington.edu/~mernst/pubs/immutability-aliasing-2013-lncs7850.pdf

根據文章一大篇,大多數客戶更喜歡深immatibility。