alp*_*pav 5 javascript performance search dictionary seek
JavaScript map有2个方法get和has.如果元素不存在或者未定义值未添加到地图,则方法get返回undefined .
因此,如果我实现我的方法GetAlways 等,它将返回现有或添加new并返回如果不存在,那么我坚持选择牺牲运行时性能使得双映射寻求或牺牲API纯度等于未定义到映射中不存在从而有效地禁止向地图安全地添加未定义的值.
有没有第三个有效和纯粹的选择,类似于C#的TryGet?
不纯的选择代码:
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;
}
Run Code Online (Sandbox Code Playgroud)
缓慢选择的代码:
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;
}
Run Code Online (Sandbox Code Playgroud)
undefined旨在表示缺少参数。唯一合理使用它的场合是检查参数是否丢失或者函数是否没有返回任何内容。如果有人将 undefined 传递给你的地图,发生什么不是你的问题。
如果这让你烦恼,尝试用 C++ 的思维方式来制作 JS:在你的文档中明确地写下期望的内容和你保证的内容。这样您就不必浪费时间(和代码性能)来测试这些错误的参数。这就是我们所说的关注点分离。
...所以我的答案是,不要尝试允许在地图中存储未定义的内容,但不要在代码中采取任何措施来阻止它。只需忽略边缘情况并说人们不允许这样做即可。