空值合并运算符的相反操作

56

Nullish coalescing 操作符允许在变量不为nullundefined时将其分配给一个变量,否则分配给另一个表达式。

a = b ?? other

相对于之前使用的 ||,它是一种改进,因为如果 b 是空字符串或其他 falsy 值但不是 nullish 值,|| 还会分配其他值。

然而,有时候我们也使用 && 进行值分配,例如:

a = b && func(b)

如果b不是nullish,我们只想在b上执行func,否则分配nullish的b

当然,&&检查falsiness,而不是nullishness。是否有一个nullish版本的&&


4
据我所知,目前没有这样的运算符(甚至连提案都没有)。但是你可以使用以下代码:a = b == null ? b : func(b) - str
1
双等号加上 null 听起来很可怕。 - f.khantsis
5
为什么?这是检查空值的方式 - str
1
@f.khantsis 如果 x == null,只有当 x = nullx = undefined 时才会返回 true。因此,它与 nullish coalescing 行为完全匹配,该行为仅对这些值进行激活。 - VLAZ
4
“如果 b 不为空值,则对其执行函数;否则将空值 b 赋值给它。” 看起来与我的代码完全一致。 - str
显示剩余2条评论
6个回答

21
据我所知,目前没有这样的运算符,也没有提案来添加这个运算符。相反,您可以依靠检查nullish值的标准方法b == null
a = b == null ? b : func(b)

如果 bfalse,使用这种方法会将其视为未定义或空值,因此会触发 func(b) - Chu
@Chu 如果 b 是 nullish(仅限 nullundefined),函数将不会运行。如果 b 是其他任何值(包括 false),函数运行,并且其结果将分配给 a。尝试在浏览器控制台中运行 false == null - forresthopkinsa
a = b == null && func(b)怎么样?如果您的linting配置禁止使用==,那么a =(b === null || b === undefined)&& func(b) - Matt Browne
1
哦,我的天啊,我使用了那么多的三个等号 ===,以至于我完全忘记了 undefined == null - Qwerty
1
@MattBrowne 即使你的代码检查工具禁止使用 ===,它仍应该允许将 == null 作为一种特殊情况。然而,在这种情况下,你最终会得到 false | T,这并不理想(尤其是如果你计划以相同方式再次使用它)。 - riv

8
这不会回答问题,因为@str已经回答了这个问题,我只是在这里发帖,因为我没有足够的声望来评论@Dalou的回答,也不想让人们被那个回答绊倒。
a = (b ?? false) && other

??并不是!的相反,因为如果b是一个假值但不是undefined/null(如''0),a将取b的值。 ??的相反应该将a设置为other的值,即使b''0也一样。


4

回答:

let a = 9;

if( a!==null || a!==undefined ){ /* actions */ };

if( (a??null) !== null ){ /* actions */ }

建议:

const oo = console.log;
let a; // undefined, null

// Syntax proposal: !?
a !? oo('NOT Nullish coalescing operator');

// Logical NOT Nullish assignment:
let a = 7;
a !?= 5;
oo(a); // 5

let b, c = null;
b !?= 3;
oo(b); // undefined
c !?= 8;
oo(c); // null

3

0

我不喜欢它,但这是我的解决方案:

output = typeof input === 'boolean' && "other"

真值表:

input     -> output
--------------------
null      -> false
undefined -> false
true      -> "other"
false     -> "other"

请注意,如果“input”是其他值(例如字符串),则此代码将返回“false”。 - Matt Browne

0
我今天刚看到这篇帖子,想在这里加上我的几句话。
虽然逆空合并运算符已经被提出
a = b !? func(b)

我不认为这个提案会被实施,也不是必须的功能,因为我们可以通过使用“&&”和“||”运算符来获得所需的行为。添加“??”是一项特殊功能,也是必须的功能。这只是我的个人意见。
我认为我们不应该等待,而是简单地使用如下方式:
a = func(b??false)

我们只需要有创意!我在函数调用中直接使用了空值合并运算符,这样我们就避免了需要反转它的需求,就像这样:
a = b != null && func(b) or so on

所以,我认为拥有!?是完全不必要的。我们只需要正确地思考它。
"如果某物不为空,则拥有它"可以简单地用空值合并运算符表示:(HAVE_IT ?? false) || (HAVE_IT ?? 0) || (HAVE_IT ?? 除了NULL之外的任何东西)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接