如果变量不是null
或undefined
,则Nullish合并运算符允许分配变量,否则允许分配表达式。
a = b ?? other
这是对以前使用的||
的改进,因为如果b
是空字符串或其他错误值,||
也将分配其他值,但不是零值。
然而,有时,我们也会使用&&
进行值分配,例如
a = b && func(b)
其中,我们只想在b
上执行func
,如果它不是零,否则分配零b
。
当然,&&
检查的是伪,而不是无效。&&
是否有无效版本?
据我所知,没有这样的运算符,也没有添加运算符的建议。相反,您可以使用标准的方法来检查无效值:b == null
a = b == null ? b : func(b)
这不会回答这个问题,因为@str已经回答了这个问题,我只是在这里发布这个,因为我没有足够的代表来评论@Dalou的回答,也不希望人们被这个答案绊倒。
a = (b ?? false) && other
不是与??
相反,因为如果b
是除undefined/null之外的伪值,则a
将取b
的值,例如''
或0
。??
的相反方应将a
设置为other
的值,即使b
是''
或0
。
答案:
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
正如其他人已经指出的那样,目前没有这样的运算符。然而,在TC39官方讨论小组中,有一些关于该运营商的建议:
- 'maybe'运算符补码??操作员
- 可选投影/表达式运算符-例如maybeNullish?:转换(maybeNulish(
- [语法]反向null合并运算符
如果你有兴趣将其纳入ECMA,这些可能是很好的起点。
我不喜欢它,但这是我的解决方案:
output = typeof input === 'boolean' && "other"
真相表:
input -> output
--------------------
null -> false
undefined -> false
true -> "other"
false -> "other"
我今天刚刚找到这篇文章,我想在上面加上我的几句话。
尽管,反零合并算子在提议中:
a = b !? func(b)
我认为这个提议不会被实现,并且是一个必须具备的功能,因为我们可以简单地使用&&
和||
运算符来获得所需的行为。??
的添加是一个特殊的特性,也是一个必须具备的特性。这只是我的看法。
我认为我们不应该等待简单地使用类似:
a = func(b??false)
我们只需要有创造力!我在这里直接在函数调用中使用了零合并运算符,所以我们避免了反转它的需要,比如:
a = b != null && func(b) or so on
因此,我认为!?
是完全没有必要的。我们只需要正确思考。
"不为空的东西就有它";可以简单地用零合并运算符表示:(HAVE_IT??false(||(HAVE-IT??0(||。