JavaScript map有两种方法get和has。 如果元素不存在,则返回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;
}
答案 0 :(得分:2)
undefined
表示缺少参数。有理由使用它的唯一情况是检查参数是否缺失或函数是否返回。如果有人将未定义的内容传递给您的地图,那么发生的情况不是您的问题。
如果它困扰你,请尝试使用C ++思维模式制作JS:在文档中明确写出预期的内容和保证的内容。然后,您不必浪费时间(和代码性能)测试那些错误的参数。这就是我们所说的关注点分离。
...所以我的答案是,不要试图允许在地图中存储undefined,但不要做任何事情来阻止它在代码中。只是忽略边缘情况,并说人们不被允许这样做。