Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby';JavaScript中的s | |=(或等于)?_Javascript_Ruby_Syntax - Fatal编程技术网

Ruby';JavaScript中的s | |=(或等于)?

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 = {};

我喜欢Ruby的
| |=
机制。如果某个变量不存在或
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]