好吧,也许不是最好的头衔,但我缺乏灵感,所以这里有:
假设您有一个“全局”(非真正)变量来存储临时数据和子数据,因为随机用户与您的服务器交互。通常在与服务器的第一次交互时,主变量将是未定义的,因此您需要处理该情况。
现在,令我困惑的是,如果有很多用户和很多方式与变量进行更多交互,那么最好的做法是做到这一点。
困惑?是的,我知道,单词不是我的强项,所以让我用代码告诉你
所以你有了
var user_data = [];
然后是一个处理用户交互以存储数据的函数
function writeData(uid, data_name, data)
现在,在第一次交互时,user_data [uid] [data_name]未定义,因此它的user_data [uid]
我知道你可以处理这两种方式:
如果 -
if(!user_data[uid]) user_data[uid] = {}
user_data[uid][data_name] = data
用try / catch
try{user_data[uid][data_name] = data}
catch(e) {user_data[uid] = {}; writeData(uid, data_name, data)}
if会检查每次互动,就像我说的那样有很多。尝试catch会触发一次,但它有成本作为块(afaik)
哪一个更好?还是有另一种更好的方法
@Nertan,你的证据有点偏袒:P。我略微调整了三元方式(与if方式的执行顺序相同)。有了这个,你可以得出结论。
//var present = require('present');
function test(val,ud,fun) {
var k = 10000000;
var t = Date.now();
for(var i=0; i<k;i++)
{
var uid = Math.ceil(Math.random()*1000);
fun(uid,ud,"value");
}
var tf = Date.now()-t;
return tf;
}
function setValue_Opp(uid,ud,value)
{
(!ud[uid] && (ud[uid] = {})) && (ud[uid].value = value);
}
function setValue_Try(uid,ud,value)
{
try{ ud[uid].value = value}
catch(e){ ud[uid] = {}; setValue_Try(uid,ud,value)};
}
function setValue_Cond(uid,ud,value)
{
if(!ud[uid]) ud[uid] = {}
ud[uid].value = value;
}
var k1=0;
var k2=0;
var k3=0;
for(var i=0;i<10;i++){
k1+=test(1,{}, setValue_Cond);
k2+=test(2,{}, setValue_Try);
k3+=test(3,{}, setValue_Opp);
}
console.log(k1,k2,k3)
我觉得我们可以利用ES6三元组如下:
let user_data = {}
const writeData = (uid, data_name, data) => {
((user_data[uid] || (user_data[uid] = {})) && (user_data[uid][data_name] = data ))
console.log(user_data)
// perform write action
}
writeData('1',"test","test1");
writeData('2',"test","test2");
writeData('1',"test","test3");
好的,所以我不得不重写测试,因为它在Snippet中不能正常工作
所以我为node.js做了这个:
var present = require('present');
function test(val,ud,fun) {
var k = 10000000;
var t = present();
for(var i=0; i<k;i++)
{
var uid = Math.ceil(Math.random()*1000);
fun(uid,ud,"value");
}
var tf = present()-t;
console.log("END "+val+" at "+tf);
return tf;
}
function setValue_Opp(uid,ud,value)
{
(ud[uid] || (ud[uid] = {})) && (ud[uid].value = value);
}
function setValue_Try(uid,ud,value)
{
try{ ud[uid].value = value}
catch(e){ ud[uid] = {}; setValue_Try(uid,ud,value)};
}
function setValue_Cond(uid,ud,value)
{
if(!ud[uid]) ud[uid] = {}
ud[uid].value = value;
}
var k1=0;
var k2=0;
var k3=0;
for(var i=0;i<10;i++){
k1+=test(1,{}, setValue_Cond);
k2+=test(2,{}, setValue_Try);
k3+=test(3,{}, setValue_Opp);
}
console.log(k1,k2,k3)
最后:3244.328997004777 3695.0267750024796 3437.6855720058084
意思是:
最好的是经典if
第二个最好的是条件运算符方法
最糟糕的是尝试捕获
所以似乎经典获胜
编辑:
通过@CRayen的进一步测试,最好的方法是:
(!ud[uid] && (ud[uid] = {})) && (ud[uid].value = value);