为什么在process.env上定义属性会导致奇怪的条件分支?

时间:2018-06-13 23:12:34

标签: javascript node.js

我试图测试一些根据环境做不同事情的代码。我以为我可以在我的测试中修改process.env的属性(虽然我认为这可能是一个坏主意),但我意识到我得到了这个奇怪的行为:

let foo = function(inp) {
  if (inp) {
    console.log(inp + ' -> if')
  } else {
    console.log(inp + ' -> else')
  }
}

// property starts undefined
foo(process.env.prop)
    // undefined -> else

process.env.prop = true
foo(process.env.prop)
    // true -> if

process.env.prop = false
foo(process.env.prop)
    // false -> if          !!!

process.env.prop = undefined
foo(process.env.prop)
    // undefined -> if      !!!

delete(process.env.prop)
foo(process.env.prop)
    // undefined -> else

我希望设置process.env.prop = false会导致else分支执行,而不是if分支。如果我在新对象上使用属性,我会得到我期望的行为(链接到REPL演示这个:https://repl.it/@JustinKulikausk/TechnologicalThickMuse)。

还有其他人经历过这个吗?我真的希望能够深入了解为什么会发生这种情况,而不仅仅是我测试的解决方法。

1 个答案:

答案 0 :(得分:2)

道具是字符串。来自the docs (v10.4.1)

  

在process.env上分配属性会隐式地将值转换为字符串。不推荐使用此行为。当值不是字符串,数字或布尔值时,Node.js的未来版本可能会抛出错误。

您的false转换为'false',这是“真实的”,因为它是长度为5的有效字符串。与关键字undefined相同。你的delete是合法的。我不确定哪个部分已被弃用,但您描述的行为看起来像是按预期工作。