短路评估并将 true 或 false 分配给变量

我有以下预配置

const preloadedConfig = {
  "configA": null, // either true, false or null is allowed};

然后我在页面加载时进行以下初始化

let finalConfig = preloadedConfig.configA || true;

场景:

  1. 预加载配置中的属性可以根据用户的偏好更改为truefalsenull

  2. 我希望使用短路评估来确定用户对页面加载的选择。如果用户未提供任何选项(null),则默认选项为 true

我的问题:

基于从这里摘录的以下内容:

Falsy 值是那些在布尔上下文中使用时强制为 false 的值,它们是 0、null、未定义、空字符串、NaN,当然还有 false。

评估如下:

true >> evaluted true // ok

null >> evaluted true // ok

false >> evaluted true // the problem area

如果用户提供false的配置选项,则最终评估值将始终为 true,因为它是“假值”。


如果提供的值为 false,我期望的结果是布尔值false。


在使用短路评估并允许 3 种类型的输入值null、true 或 false 的同时,我应该怎么做才能使这项工作正常进行?


慕森卡
浏览 137回答 3
3回答

暮色呼如

您可以改用nullish 合并运算符。let finalConfig = preloadedConfig.configA ?? true;或者,您可以使用hasOwnProperty支票。let finalConfig = preloadedConfig.hasOwnProperty('configA') ? preloadedConfig.configA : true;

慕标琳琳

在现代环境中(或使用转译器),我会使用空合并运算符,仅当左侧为空或未定义时,该运算符才采用右侧:let finalConfig = preloadedConfig.configA ?? true;否则,使用条件运算符:let finalConfig = preloadedConfig.configA == null ? true : preloadedConfig.configA;

FFIVE

您可以通过使用旧的 Object.assign 或现代的 destruct ... 属性来使默认规则更好一些。即使为 null,这也会覆盖 configAconst yourConfig = {    configA: true,    ...preloadedConfig}使用旧的环境会是Obejct.assign({configA: true},preloadedConfig)编辑:将空值作为默认值是const yourConfig = {    configA: true,    ...Object.fromEntries(Object.entries(preloadedConfig).filter(([key,val])=>val!==null))}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript