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

标签 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 )。

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

最佳答案

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

Assigning a property on process.env will implicitly convert the value to a string. This behavior is deprecated. Future versions of Node.js may throw an error when the value is not a string, number, or boolean.

您的 false 会转换为 'false',这是“truthy”,因为它是长度为 5 的有效字符串。与关键字 undefined 相同>。您的删除是合法的。我不确定哪一部分已被弃用,但您描述的行为看起来像预期的那样工作。

关于javascript - 为什么在 process.env 上定义属性会导致奇怪的条件分支?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50847559/

相关文章:

node.js - 将附加参数传递给 node.js 回调

javascript - 使用 D3.js 水平翻转文本半圈

javascript - 如何激活另一个 div 内的 div 的悬停?

javascript - 在node.js中使用es6类有用吗?

javascript - Node.JS Express Promise 问题

node.js - 在centos 6.4和nginx上将cakephp 2.4与redis连接

javascript - 为什么 .sort() 在按字母顺序对某些数组进行排序时表现不正确?

javascript - 如何在同一个函数中使用 setInterval() 和 clearInterval()

javascript - 跟踪是否在输入字段中按下了退格键或删除键

node.js - PassportJS 在用户通过身份验证后不重定向