Ruby在JavaScript中|| =(或等于)?


128

我喜欢Ruby的||=机制。如果变量不存在或为nil,则创建它并将其设置为等于:

amount # is nil
amount ||= 0 # is 0
amount ||= 5 # is 0

我现在需要在JavaScript中执行类似的操作。有什么惯例或正确的方式来做到这一点?我知道这||=是无效的语法。有两种明显的处理方法:

window.myLib = window.myLib || {};

// or

if (!window.myLib)
  window.myLib = {};

Answers:


152

两者都是绝对正确的,但是如果您正在寻找类似||=红宝石的产品。第一种方法是variable = variable || {}您要寻找的方法:)


如果的有效值x是虚假的(如)false,并且只想在x未定义时设置默认值,则应谨慎使用。
约书亚·品特

22

您可以使用逻辑“或”运算符||,如果它lVal是一个伪造的值,它将评估其正确的操作数。

虚假值包括例如 null, false, 0, "", undefined, NaN

x = x || 1

如果的有效值x是虚假的(如)false,并且只想在x未定义时设置默认值,则应谨慎使用。
约书亚·品特

4

如果您正在使用对象,则可以使用分解(自ES6起),如下所示:

({ myLib: window.myLib = {} } = window);

...但是除了困惑之外,您不会从公认的答案中获得任何收获。


1
“但是,除了混乱之外,您不会从公认的答案中得到任何收获” –很好。:)
lindes

我敢打赌有人会以此为理由讨厌javascript
Volper


-1

Ruby的|| =运算符短路分配。可以这样想:

return a || a = b

因此,在javascript中,这看起来非常相似:

return a || (a = b);

但是,正如下面的评论所指出的那样,这种字面的红宝石形式比标准的JavaScript惯用语a = a ||效率低。b。

供参考:http : //www.rubyinside.com/what-rubys-double-pipe-or-equals-really-does-5488.html


1
在实践中,这种a = a || b形式似乎更合适jsperf.com/x-or-x-equals-0-vs-x-equals-x-or-0/3
jchook

啊很酷的工具。如果x有一个值并且发生短路,那会是什么样?
克里斯,

我认为拆卸需要在jsperf上进行,因此此测试应显示短路性能。我的猜测是V8对表单有特殊的优化a = a || b
jchook

3
仅供参考,看来现在已经消除了任何差异。
查尔斯伍德

a || (a = b)具有推断功能名称的正确语义。目前正在讨论新提案。
user4642212

-1

您可以在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]

问题不是关于|还是|=。问题中所需的行为与按位运算无关。
user4642212

您说得对,我将相应地编辑答案
wallgeek

编辑。我希望现在有道理。
wallgeek
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.