在 ImmutableJS 中使用带有 "deep" 参数的 Immutable.set() 安全吗?
Is using Immutable.set() with "deep" parameters in ImmutableJS safe?
试用 immutable-js,我发现了一些我不完全理解的东西,想确保我正确使用了 set。
基本上,如果您使用 "set()" 为对象或数组设置 属性 的值,它会存储原始 object/array,而如果您使用合并,它会如我所料,将原始数组转换为不可变列表。
所以我的问题是:你应该避免将 set() 与 objects/arrays 一起用于参数 2 吗?
这里是 Jasmine 测试示例:
it("can do a thing you shouldn't do(?) - inject a normal object into a Map via set", function(){
const expected = fromJS({ a: [ 3, 4, 5 ] });
const set_value = expected.set("a", [3, 4,5]);
const merge_value = expected.merge({"a": [3, 4,5]});
expect(expected.get("a")).toEqualImmutable(set_value.get("a")); // Fails
expect(expected.get("a")).toEqualImmutable(merge_value.get("a")); // Passes
})
输出为:
Message:
Expected
List [ 3, 4, 5 ]
to equal
3,4,5
仅当您希望不可变对象包含 objects/arrays.
时,才应将 set() 与 objects/arrays 一起使用
也就是说,这是一个没有确定正确答案的风格选择。
一个好的经验法则是不要将可变对象放入不可变集合中,除非您知道自己在做什么并且有 非常好的 理由。
安全吗?
这取决于你所说的安全是什么意思。
截至 4.0.0-rc8
getIn
、setIn
、updateIn
、merge
、toJS
等都应该使用包含可变数据的不可变集合,所以在这方面你是安全的.
另一方面,如果您开始将可变值放入不可变容器中,那么您首先会失去拥有不可变集合的很多好处。您不再保证对同一对象的引用将始终包含相同的数据。
试用 immutable-js,我发现了一些我不完全理解的东西,想确保我正确使用了 set。
基本上,如果您使用 "set()" 为对象或数组设置 属性 的值,它会存储原始 object/array,而如果您使用合并,它会如我所料,将原始数组转换为不可变列表。
所以我的问题是:你应该避免将 set() 与 objects/arrays 一起用于参数 2 吗?
这里是 Jasmine 测试示例:
it("can do a thing you shouldn't do(?) - inject a normal object into a Map via set", function(){
const expected = fromJS({ a: [ 3, 4, 5 ] });
const set_value = expected.set("a", [3, 4,5]);
const merge_value = expected.merge({"a": [3, 4,5]});
expect(expected.get("a")).toEqualImmutable(set_value.get("a")); // Fails
expect(expected.get("a")).toEqualImmutable(merge_value.get("a")); // Passes
})
输出为:
Message:
Expected
List [ 3, 4, 5 ]
to equal
3,4,5
仅当您希望不可变对象包含 objects/arrays.
时,才应将 set() 与 objects/arrays 一起使用也就是说,这是一个没有确定正确答案的风格选择。 一个好的经验法则是不要将可变对象放入不可变集合中,除非您知道自己在做什么并且有 非常好的 理由。
安全吗?
这取决于你所说的安全是什么意思。
截至 4.0.0-rc8
getIn
、setIn
、updateIn
、merge
、toJS
等都应该使用包含可变数据的不可变集合,所以在这方面你是安全的.
另一方面,如果您开始将可变值放入不可变容器中,那么您首先会失去拥有不可变集合的很多好处。您不再保证对同一对象的引用将始终包含相同的数据。