【问题标题】:javascript alternative to strict evaluationjavascript 替代严格评估
【发布时间】:2012-02-10 13:34:20
【问题描述】:

我正在制作一个 javascript 游戏,具有多个级别,存储在 json 中。 加载时,我运行一个函数来“解析”关卡对象,方法是用默认值替换不存在的值,或者用对象替换一些值,例如:

//i is the variable I use to loop through the enemies

if (typeof(level.enemies[i].life)=="undefined") {
 level.enemies[i].life=100;
}

if (typeof(level.enemies[i].follow)=="number") {
 level.enemies[i].follow=level.enemies[level.enemies[i].follow];
 // replace the number of the enemy,
 // by a reference to the actual enemy.
}

问题是我在整个函数中有很多与这些类似的“ifs”,我想知道是否可以以某种方式将它们简化为一个函数,以便我可以这样做:

replaceByType(level.enemies[i].life,"undefined",100);
replaceByType(level.enemies[i].follow,"number",level.enemies[level.enemies[i].follow]);

遗憾的是,我不知道该怎么做,因为它们无法通过引用传递变量(对象除外)。也许还有另一种方法可以简化我的代码?

【问题讨论】:

    标签: javascript function pass-by-reference


    【解决方案1】:

    我想你想要这样的东西:

    replaceIfAbsent(level.enemies[i], "life", 100);
    
    function replaceIfAbsent(obj, property, newVal){
       if (typeof obj[property] === "undefined")
           obj[property] = newVal;
    }
    

    或者为什么不一次做多个属性:

    function replaceIfAbsent(obj, properties){
       for (var prop in properties)
           if (typeof obj[prop.name] === "undefined")
               obj[prop.name] = prop.value;
    }
    
    replaceIfAbsent(level.enemies[i], [{name: "life", value: 100}, {name: "number", value: 12}]);
    

    你在使用 jQuery 吗?如果是这样,您可以这样做:

    $.extend(level.enemies[i], {"life": 100, "number": 12});
    

    【讨论】:

    • +1 用于 jQuery.extend 建议(这将是我唯一的建议 ;-) -- 其他库,不仅仅是 jQuery,提供了合并功能。
    【解决方案2】:

    由于您可以通过引用传递对象,因此您可以传递要替换的对象的属性。

    function replaceByType(obj, property, type, value) {
       if(typeof obj[property] === type) {
         obj[property] = value;
       }
    }
    

    你几乎可以按照你想要的方式调用它:

    replaceByType(level.enemies[i], "life", "undefined", 100); 
    replaceByType(level.enemies[i], "follow", "number", level.enemies[level.enemies[i].follow]); 
    

    【讨论】:

    • 太棒了!我没有考虑过将对象与其属性分开。我们甚至可以通过replaceByType(window,"variable","undefined",5); 来更改全局变量!
    【解决方案3】:
    Pass anonymous functions:
    
    function replaceByType(test, pass, fail){
       if(test()) return pass;
       else return fail;
    }
    
    replaceByType(function(){return level.enemies[i].life},"undefined",100);
    

    这会将评估推迟到 replaceByType 内部。

    【讨论】:

      猜你喜欢
      • 2013-02-01
      • 1970-01-01
      • 2016-09-11
      • 1970-01-01
      • 2018-02-11
      • 1970-01-01
      • 2015-12-30
      • 1970-01-01
      相关资源
      最近更新 更多