提问人:Proxycon 提问时间:11/25/2021 最后编辑:Proxycon 更新时间:11/25/2021 访问量:982
是否有反向逻辑无效赋值?
Is there a reverse logical nullish assignment?
问:
因此,仅当当前存储的值为空时,运算符才会将值分配给变量。??=
也许我错过了显而易见的东西,但我想不出一个巧妙的解决方案(没有 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
答:
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
上一个:对象解包赋值操作?
评论
x ??= undefined
x
x
x
2
x ??= 3
2
3
undefined