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

时间:2013-09-30 07:20:25

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

8 个答案:

答案 0 :(得分:121)

两者都是绝对正确的,但如果你正在寻找像红宝石中的||=那样的东西。第一种方法variable = variable || {}就是你要找的那个:)

答案 1 :(得分:18)

如果||是假值,您可以使用逻辑OR运算符lVal来计算其右操作数。

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

x = x || 1

答案 2 :(得分:4)

如果你正在使用对象,你可以使用解构(因为ES6),如下所示:

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

......但除了困惑之外,你没有获得任何可接受的答案。

答案 3 :(得分:0)

您询问的运营商has been proposed as a feature in JavaScript。它目前位于Stage 1,因此仍然很有可能永远不会成为该语言的正式组成部分。

您现在可以使用the plugin-proposal-logical-assignment-operators Babel plugin使用它。我从未使用过该插件,所以我不知道它的效果如何。

答案 4 :(得分:0)

逻辑空赋值 (??=)

x ??= 23

Documentation & Browser compatibility

答案 5 :(得分:0)

从 2021 年开始,只要您正在转译或不关心 Opera/IE,您就可以使用行为与 Ruby 相同的 ||=

逻辑 OR 赋值,||= 现在在除 Opera 和 IE 之外的所有主要浏览器的 javascript 中都得到原生支持。 Current caniuse matrixMDN reference

Typescript 添加了对 version 4 中的运算符的支持。如果您需要支持 IE/Opera,您可以使用 babel plugin 进行转换以获得广泛的兼容性。

答案 6 :(得分:-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]

答案 7 :(得分:-2)

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

return a || a = b

所以在javascript中,这看起来非常相似:

return a || (a = b);

然而,似乎在下面的评论中指出,这个文字的ruby形式效率低于标准的javascript惯用语a = a ||湾

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