我最近在查看Facebook's Immutable-JS库,看到了以下有趣的行为:
var map1 = Immutable.Map({a:1, b:2, c:3});
var clone = map1;
图书馆确保map1 !== clone
。
这是如何实现的?我怀疑有可能覆盖一个检索对象引用的属性方法,就像Object.prototype.valueOf
在需要对象的原始值时那样做,但是不能找到任何类似的东西。
答案 0 :(得分:1)
查看文档,我认为您并不了解它是如何工作的:您没有使用Javascript语法object['key'] = value
设置/取消设置密钥,而是使用map.set('key', val)
。然后你程序员必须将结果对象分配给某个变量,因为更新没有写入:它返回一个修改过的(而且是不可变的副本)。作为优化,如果.set()
实际上没有更改密钥的值,则返回this
,因此您可以断言参考相等
似乎作为捕获编程错误的帮助,当您尝试使用immutableMap.key = 'val'
设置密钥时,库也会抛出错误(尽管使用immutableMap.key
读取应该是安全的)