我试图测试一些根据环境做不同事情的代码。我以为我可以在我的测试中修改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)。
还有其他人经历过这个吗?我真的希望能够深入了解为什么会发生这种情况,而不仅仅是我测试的解决方法。
答案 0 :(得分:2)
道具是字符串。来自the docs (v10.4.1)
在process.env上分配属性会隐式地将值转换为字符串。不推荐使用此行为。当值不是字符串,数字或布尔值时,Node.js的未来版本可能会抛出错误。
您的false
转换为'false'
,这是“真实的”,因为它是长度为5的有效字符串。与关键字undefined
相同。你的delete
是合法的。我不确定哪个部分已被弃用,但您描述的行为看起来像是按预期工作。