JavaScript 地图中的双重搜索与未定义:TryGet wanted

Double seek vs undefined in JavaScript Map: TryGet wanted

JavaScript map has 2 methods get and has。 如果元素不存在 或者如果值 undefined 被添加到映射.

,方法获取 returns undefined

因此,如果我实现我的方法 GetAlways or such,它将 return 存在或添加新的并且 return 如果不存在,那么我将不得不选择牺牲运行时性能进行双重地图搜索或牺牲 API 纯度等同于地图中不存在未定义,从而有效地禁止向地图安全添加未定义的值。

是否有第三种高效而纯粹的选择,类似于TryGet from C#

不纯选择的代码:

Map.prototype.GetAlways = function(name){
    let child = this.get(name);
    if (child === undefined){ // equating undefined value to non-existence
        child = {};
        this.set(name, child);
    }
    return child;
}

慢速选择代码:

Map.prototype.GetAlways = function(name){
    if(this.has(name)) // first map seek
        return this.get(name); // second map seek
    let child = {};
    this.set(name, child);
    return child;
}

undefined的意思是表示缺少一个参数。唯一可以使用它的场合是检查参数是否丢失或函数是否返回任何内容。如果有人将 undefined 传递给您的地图,那么发生的事情不是您的问题。

如果它困扰你,试着用 C++ 的思维方式来制作 JS:在你的文档中明确地写下你期望什么和你保证什么。这样您就不必浪费时间(和代码性能)测试那些错误的参数。这就是我们所说的关注点分离。

...所以我的答案是,不要试图允许在地图中存储未定义的内容,但不要采取任何措施来阻止它在代码中的使用。忽略边缘情况并说不允许人们这样做。