Javascript 为什么在process.env上定义属性会导致奇怪的条件分支?
我正在测试一些代码,这些代码根据环境做不同的事情。我认为我可以在测试中修改Javascript 为什么在process.env上定义属性会导致奇怪的条件分支?,javascript,node.js,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
上的属性(尽管我认为这可能是个坏主意),但我意识到我得到了一个非常奇怪的行为:
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,演示如下:)
还有其他人经历过吗?我真的希望了解为什么会发生这种情况,而不仅仅是我的测试解决方案。道具是字符串。从
在process.env上指定属性将隐式地将值转换为字符串。此行为不受欢迎。如果值不是字符串、数字或布尔值,Node.js的未来版本可能会引发错误
您的false
将转换为'false'
,该字符串为“truthy”,因为它是长度为5的有效字符串。与关键字未定义
相同。您的删除
是合法的。我不确定哪一部分是不推荐的,但您描述的行为看起来像是在按预期工作。道具是字符串。从
在process.env上指定属性将隐式地将值转换为字符串。此行为不受欢迎。如果值不是字符串、数字或布尔值,Node.js的未来版本可能会引发错误
您的
false
将转换为'false'
,该字符串为“truthy”,因为它是长度为5的有效字符串。与关键字未定义
相同。您的删除
是合法的。我不确定哪一部分是不推荐的,但您描述的行为看起来像预期的那样工作。我认为这是因为错误的价值观。我认为这是因为错误的价值观。非常感谢!因此,看起来我可以通过为属性分配一个空字符串来获得一个falsy值(我需要这个值)。非常感谢!因此,看起来我可以通过给属性分配一个空字符串来获得一个falsy值(我需要这个值)。