是否有反向逻辑无效赋值?

Is there a reverse logical nullish assignment?

提问人:Proxycon 提问时间:11/25/2021 最后编辑:Proxycon 更新时间:11/25/2021 访问量:982

问:

因此,仅当当前存储的值为空时,运算符才会将值分配给变量。??=

也许我错过了显而易见的东西,但我想不出一个巧妙的解决方案(没有 if 语句)仅在值不为空时才分配?

我正在使用 nodeJS 来提供更多上下文


我想要

let x r??= 2;
// Updates 'x' to hold this new value
x r??= undefined;
// Has no effect, since the value to assign is nullish
console.log(x); // 2

编辑以更清楚地说明我的问题:

我只想为变量分配一个新值,如果该新不为空。

let iceCream = {
    flavor: 'chocolate'
}

const foo = 2.5
const bar = undefined;

iceCream.price r??= bar
// does not assign the new value because it is nullish
console.log(iceCream.price) // expected to be error, no such property

iceCream.price r??= foo
// assigns the new value because it is not nullish but a float
console.log(iceCream.price) // expected to be 2.5

iceCream.price r??= bar
// does not assign the new value because it is nullish
console.log(iceCream.price) // expected to still be 2.5
javascript 赋值运算符 nullish-coalescing

评论

0赞 Ivar 11/25/2021
不是已经这样做了吗?x ??= undefined
1赞 Ry- 11/25/2021
@DanielBaldi:我认为这是如果值不是空的。
2赞 Ry- 11/25/2021
@Proxycon:为了清楚起见,请说明您将在何处使用它的上下文和最合适的替代方案?
2赞 Ivar 11/25/2021
据我了解(我认为 Ry 指的是),如果右侧操作器不是无效的(不是当不是无效),OP 想要设置为右侧操作器。虽然我最初的评论不起作用,因为如果两个值都不是空值,它仍然会保持不修改(如果 is 并且您使用 ,它将保留而不是分配)。xxx2x ??= 323
2赞 Ivar 11/25/2021
关于“expected to be error, no such property”,请注意,访问对象的不存在属性不会引发错误。它只是返回 undefined。(但是,访问值/属性的属性会引发错误。undefined

答:

4赞 Ry- #1

不,这不是一个单一的操作员。最接近的是两个运算符:

x = undefined ?? x;

评论

0赞 Proxycon 11/25/2021
这很接近,但如果我想在对象上设置新属性,则不起作用。
1赞 Ry- 11/25/2021
@Proxycon:那么,你需要一个或一个函数来包装一个。if
-1赞 Daniel Baldi 11/25/2021 #2

您可以使用逻辑 AND 赋值

来自 MDN Web 文档:

let a = 1;
let b = 0;

a &&= 2;
console.log(a);
// expected output: 2

b &&= 2;
console.log(b);
// expected output: 0

评论

0赞 Proxycon 11/25/2021
但是这个运算符也只取决于存储在变量中的值,而不是如果我理解正确的话要分配的值。
0赞 gyohza 2/5/2022
这个答案并没有真正解决这个问题。这仅考虑任务的左侧。正如其他注释中所解释的,OP 希望在右侧(即新值)为非空值时进行赋
0赞 Daniel Baldi 11/25/2021 #3

在澄清后添加另一个答案,因为编辑我的前一个答案似乎很奇怪。

我能想到的没有 if 的解决方案的最简单方法如下:

let iceCream = {
    flavor: 'chocolate'
}

const foo = 2.5
const bar = undefined;
bar && (iceCream.price = bar)
// Another possible solution if creating the property with a nullish value is ok for you:
iceCream.price = bar || iceCream.price;

评论

1赞 gyohza 2/5/2022
这比你的另一个答案要好,但 non-nullish 不等同于“真实”,nullish 不等同于 'falsy'。这种区别对于问题非常重要,因为 OP 希望分配正确的值,例如 和 (被评估为虚假的)。0""false