仅在未设置字符串值时运行,每次都在运行

时间:2017-05-24 16:51:58

标签: javascript screeps

我试图仅在变量不是有效字符串时才运行代码块(长度> 0,而不是未定义)。基于this SO post我认为我做得对,但每次都会运行。我在这里做错了什么?

    if (creep.memory.sourceid ||creep.memory.depositLoc||creep.memory.sourceType)
    {
        creep.memory.sourceid = getSourceMinWorkers(creep);
        creep.memory.sourceType='energy';
creep.memory.depositLoc=getClosestDepositLoc(creep.memory.sourceid,creep.memory.sourceType);
        console.log(creep.name," harvesting ",creep.memory.sourceType," at: ",creep.memory.sourceid," depositing at: ",creep.memory.depositLoc);
    }

console.log的输出:

H1_1  harvesting  energy  at:  81a61f68f5eb4057223b05b2  depositing at:  a7633d25d9058f616ab8a0f3
H1_1  harvesting  energy  at:  1649baad43f736c9fc13d2ad  depositing at:  a7633d25d9058f616ab8a0f3

1 个答案:

答案 0 :(得分:3)

您正在使用OR(||)运算符进行检查。这意味着如果其中一个条件为真,条件将运行(如果是字符串,则为非空)。

你有这个条件:

if (creep.memory.sourceid || creep.memory.depositLoc || creep.memory.sourceType) {

这意味着如果设置了creep.memory.sourceid或设置了creep.memory.depositLoc或设置了creep.memory.sourceType,它就会运行。

我看到你用这一行记录3个变量:

console.log(creep.name," harvesting ",creep.memory.sourceType," at: ",creep.memory.sourceid," depositing at: ",creep.memory.depositLoc);

每次运行块时都会记录数据,我看到3个参数都是非空字符串,因此代码按预期工作。

根据您的代码,我认为只有在设置了2个参数但没有位置时才会运行代码,因此您必须将OR运算符切换为AND(&&),如果ALL 3条件为真,则会通过。此外,您还必须检查位置是否为空,如下所示:

if (creep.memory.sourceid && !creep.memory.depositLoc && creep.memory.sourceType) {
//    Notice the exclamation ^ up there

这样,如果有源ID,则会运行代码块。如果DON' T(!)有存款位置且是否有源类型。注意位置参数之前的感叹号。这意味着这是对价值的否定。