Ruby';JavaScript中的s | |=(或等于)?
我喜欢Ruby的Ruby';JavaScript中的s | |=(或等于)?,javascript,ruby,syntax,Javascript,Ruby,Syntax,我喜欢Ruby的| |=机制。如果某个变量不存在或nil,则创建该变量并将其设置为: amount # is nil amount ||= 0 # is 0 amount ||= 5 # is 0 我现在需要在JavaScript中执行类似的操作。什么是惯例或适当的方式来做这件事?我知道| |=的语法无效。两种明显的处理方法是: window.myLib = window.myLib || {}; // or if (!window.myLib) window.myLib = {};
| |=
机制。如果某个变量不存在或nil
,则创建该变量并将其设置为:
amount # is nil
amount ||= 0 # is 0
amount ||= 5 # is 0
我现在需要在JavaScript中执行类似的操作。什么是惯例或适当的方式来做这件事?我知道| |=
的语法无效。两种明显的处理方法是:
window.myLib = window.myLib || {};
// or
if (!window.myLib)
window.myLib = {};
这两种方法都是绝对正确的,但是如果您正在寻找类似ruby中的
| |=
的东西。第一种方法是variable=variable |{}
,您正在寻找:)您可以使用逻辑OR运算符|
,如果lVal
是错误值,它会计算其右操作数
Falsy值包括例如null、false、0、“、未定义、NaN
x = x || 1
Ruby的| |=操作员短路分配。可以这样想:
return a || a = b
所以在javascript中,这看起来非常相似:
return a || (a = b);
然而,正如下面的评论所指出的,这种文本ruby形式的效率低于标准javascript习惯用法a=a | | b
供参考:
如果您使用的是对象,您可以像这样使用解构(从ES6开始):
…但是除了困惑之外,你对接受的答案没有任何收获。你问的接线员。它目前在,也将在,预计将于2021年出版
您现在可以使用。我从未使用过该插件,所以我不知道它的工作情况如何。在javascript中,仅对整数使用|=运算符就可以实现所需的行为。但是你必须先定义变量
let a = 0
a |= 100
console.log(a) // 100
对于对象
let o = {}
o.a |= 100
console.log(o) // {a: 100}
用于阵列
let arr = []
arr[0] |= 100
console.log(arr) // [100]
逻辑零赋值(??=)
x???=23
从2021年起,只要您正在传输或不关心Opera/IE,就可以使用与Ruby相同的行为 除了Opera和IE之外,所有主要浏览器的javascript都支持逻辑OR赋值,
| |=
Typescript为中的运算符添加了支持。如果您需要支持IE/Opera,您可以使用to Transbile以获得广泛的兼容性。实际上,似乎
a=a | | b
表单是更理想的工具。如果x有一个值,那么短路会是什么样子呢?我认为在jsperf上需要明确显示拆卸,所以应该显示短路性能。我的猜测是V8对形式a=a | | b
有一个特殊的优化。仅供参考,它看起来已经优化掉了任何差异。a | |(a=b)
具有正确的语义来推断函数名。新提案目前正在接受中。“但除了困惑之外,你在接受的答案上没有任何收获”——很好我打赌有人会把这当作讨厌Javascript的理由。问题不是关于
或=
。问题中所需的行为与按位操作无关。已编辑。我希望它现在有意义。如果x
的有效值是falsy,如false
,并且您只想在x
未定义时设置默认值,请小心使用此选项。如果x
的有效值是falsy,如false
,请小心使用此选项,您只想在x
未定义时设置默认值。以上注释是正确的。以您的示例为例,它在JS中的工作方式不同<代码>出租金额=0代码>后跟金额=金额| 5
将金额更改为5。如果您不希望发生这种情况,请使用?
运算符而不是|
@AshwinKumarS,或者只使用数量???=5代码>@user4642212我认为这种语法在JS中不起作用,是吗?@AshwinKumarS是的,它起作用了。请参阅,.Update:该提案现在处于第4阶段,并包含在ECMAScript规范的最新草案中。它将包含在下一个标准中,该标准将于2021年发布。
let arr = []
arr[0] |= 100
console.log(arr) // [100]