在JavaScript / Node Js中动态处理未定义变量的最佳实践

问题描述 投票:0回答:3

好吧,也许不是最好的头衔,但我缺乏灵感,所以这里有:

假设您有一个“全局”(非真正)变量来存储临时数据和子数据,因为随机用户与您的服务器交互。通常在与服务器的第一次交互时,主变量将是未定义的,因此您需要处理该情况。

现在,令我困惑的是,如果有很多用户和很多方式与变量进行更多交互,那么最好的做法是做到这一点。

困惑?是的,我知道,单词不是我的强项,所以让我用代码告诉你

所以你有了

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)

哪一个更好?还是有另一种更好的方法

javascript node.js optimization try-catch
3个回答
1
投票

@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)

0
投票

我觉得我们可以利用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");

0
投票

好的,所以我不得不重写测试,因为它在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);
© www.soinside.com 2019 - 2024. All rights reserved.