阅读Promises/A+规范时,我遇到了“深度不可变性”这个术语。文本如下:
这里,“不得更改”表示不可变的标识(即===),但并不意味着具有深度的不可变性。
什么是深度不可变性?能否举个例子解释一下?
这里,“不得更改”表示不可变的标识(即===),但并不意味着具有深度的不可变性。
什么是深度不可变性?能否举个例子解释一下?
一旦一个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
如您所见,从已解决的 Promise 返回的值始终保持相同的对象值 - a === value
。试图将对象绑定到不同的值只会在 then 块的范围内应用,我们在下一次调用 Promise 的 then 方法时仍然看到原始的对象值。
当我们更改此数组属性之一(在本例中为第一个元素)的值时,我们注意到此更改会影响原始值,因此也会影响从此 Promise 返回的已解决值。如果已解决的值具有深度不可变性,则其所有属性及其属性都将是不可变的,但我们刚刚证明这并非事实。
===
的工作方式和它用于确定两个东西是否相等的方法思考。 - Bartek Banachewiczconst
如何工作。const
值具有不可变的身份,但不是深度不可变的。 - tex