136

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

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

我现在需要在 JavaScript 中做类似的事情。这样做的惯例或正确方法是什么?我知道||=语法无效。两种明显的处理方法是:

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

// or

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

8 回答 8

156

两者都是绝对正确的,但如果你正在寻找像||=ruby​​ 一样工作的东西。第一种方法是variable = variable || {}您正在寻找的方法:)

于 2013-09-30T07:27:53.307 回答
22

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

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

x = x || 1
于 2013-09-30T07:28:52.300 回答
7

您询问的运算符已被提议作为 JavaScript 中的一项功能。目前处于第 4 阶段,将在预计于 2021 年发布的下一个 ECMAScript 标准中引入。

您现在可以使用plugin-proposal-logical-assignment-operators Babel 插件来使用它。我从来没有使用过那个插件,所以我不知道它的效果如何。

于 2019-10-31T00:17:58.700 回答
5

如果你正在处理对象,你可以像这样使用解构(从 ES6 开始):

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

...但是除了混淆之外,您对接受的答案没有任何好处。

于 2017-06-06T02:26:48.817 回答
3

逻辑无效赋值 (??=)

x ??= 23

文档和浏览器兼容性

于 2021-01-16T16:34:52.033 回答
2

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

逻辑或赋值,||=现在除了 Opera 和 IE 之外的所有主要浏览器都在 javascript 中原生支持。当前的 caniuse 矩阵MDN 参考

Typescript 在版本 4中增加了对操作符的支持。如果您需要支持 IE/Opera,您可以使用babel 插件进行转译以获得广泛的兼容性。

于 2021-05-19T06:08:56.433 回答
-1

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

于 2015-11-25T04:37:14.093 回答
-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]
于 2020-07-16T14:09:06.723 回答