什么是深度不变性?

Fli*_*lip 4 javascript immutability promise

在阅读Promises/A+规范时,我遇到了术语“深度不变性”。文字说:

\n\n
\n

这里,\xe2\x80\x9cm不能改变\xe2\x80\x9d表示不可变身份(即===),但并不意味着深度不变性。

\n
\n\n

什么是深度不变性?\n有人可以用例子解释一下吗?

\n

Joe*_*oel 6

一旦 Promise 被解决,任何再次解决它的尝试都将无效,这意味着解决的值将始终与原始解决的值严格相等。然而,这并不意味着该值不能改变,即“并不意味着深度不变性”

这可以用一个例子来证明:

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
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,从已解决的 Promise 返回的值始终保持相同的 Object 值 - a === value。尝试将对象绑定到不同的值仅适用于 then 块的范围内,并且下次调用 Promise 上的 then 方法时我们会看到原始对象值。

当我们更改该数组的一个属性的值(在本例中为第一个元素)时,我们注意到此更改会影响原始值,因此也会影响从此 Promise 返回的解析值。如果解析的值具有深度不可变性,那么它的所有属性及其属性都将是不可变的,但是我们刚刚表明情况并非如此。