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

时间:2016-10-14 02:21:18

标签: javascript performance dictionary search seek

JavaScript map有两种方法gethas。 如果元素不存在,则返回undefined undefined 或者如果将value undefined添加到地图

因此,如果我实现我的方法GetAlways or such,它将返回现有或添加new并返回(如果不存在),那么我坚持选择牺牲运行时性能使双映射寻求或牺牲API纯度等于undefined在地图中不存在,从而有效地禁止在地图上安全地添加未定义的值。

是否有第三种有效且纯粹的选择,类似于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;
}

1 个答案:

答案 0 :(得分:2)

undefined表示缺少参数。有理由使用它的唯一情况是检查参数是否缺失或函数是否返回。如果有人将未定义的内容传递给您的地图,那么发生的情况不是您的问题。

如果它困扰你,请尝试使用C ++思维模式制作JS:在文档中明确写出预期的内容和保证的内容。然后,您不必浪费时间(和代码性能)测试那些错误的参数。这就是我们所说的关注点分离。

...所以我的答案是,不要试图允许在地图中存储undefined,但不要做任何事情来阻止它在代码中。只是忽略边缘情况,并说人们不被允许这样做。