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

时间:2018-08-31 15:01:09

标签: javascript node.js optimization try-catch

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

比方说,当随机用户与服务器交互时,您有一个“全局”(不是真的)变量来存储临时数据和子数据。通常,在与服务器的第一次交互中,main变量是不确定的,因此您需要处理这种情况。

现在,令我感到困惑的是,如果有很多用户并且很多方式与变量进行更多交互,那么执行此操作的最佳实践是什么?

困惑吗?是的,我知道,文字不是我的强项,所以让我向您展示代码

所以你有

var_dump($testArr)

然后是处理用户交互以存储数据的功能

array (size=2)
  'feeling' => string 'love' (length=4)
  'inverse' => string 'hate' (length=4)
  3 => int 300

现在,在第一次交互时,user_data [uid] [data_name]是未定义的,所以它是user_data [uid]

我知道您可以通过以下两种方式进行处理:

使用if -

Array

使用try / catch

CURRENT_PRIVILEGESET

if是否会检查每个交互,就像我说的那样,有很多。 尝试捕获将触发一次,但需要付出一定的代价(afaik)

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

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

我觉得我们可以利用以下ES6三元组:

; expected

答案 2 :(得分:0)

好,所以我不得不重写测试,因为它在代码段中无法正常工作

所以我为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

意思是:

最好的是经典的

第二好的是常规运算符方法

最糟糕的是尝试捕获

所以经典似乎胜利了

编辑:

借助@CRayen进行进一步的测试,最好的方法是:

 (!ud[uid] && (ud[uid] = {})) && (ud[uid].value = value);