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

我喜欢 Ruby 的 ||=机制。如果一个变量不存在或者是 nil,那么创建它并设置它等于:

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

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

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


// or


if (!window.myLib)
window.myLib = {};
52653 次浏览

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

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

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

x = x || 1

Ruby 的 | | = 操作符短路赋值。可以这样想:

return a || a = b

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

return a || (a = b);

然而,正如下面的注释中指出的那样,这种文字形式的 Ruby 比标准的 javascript 习惯用法 a = a | | b 效率低。

参考资料: Http://www.rubyinside.com/what-rubys-double-pipe-or-equals-really-does-5488.html

如果您使用的是对象,您可以像下面这样使用解构(自 ES6起) :

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

但是你得不到任何东西超过接受的答案,除了困惑。

你问的 已被提议作为 JavaScript 的一个特性的接线员。它目前在 第四阶段,它将是 在下一个 ECMAScript 标准中引入,预计将在2021年出版。

您现在可以使用 插件-提议-逻辑-分配-操作符 Babel 插件来使用它。我从来没有使用过这个插件,所以我不知道它是如何工作的。

您可以在 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年,你可以使用与 Ruby 行为相同的 ||=,只要你不关心 Opera/IE。

逻辑或赋值,||=现在在除 Opera 和 IE.当前犬状矩阵.MDN 参考资料之外的所有主流浏览器的 javascript 中都得到了本机支持。

类型脚本在 版本4中增加了对操作员的支持。如果你需要支持 IE/Opera,你可以使用 Babel 插件来实现广泛的兼容性。