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

at.*_*at. 118 javascript ruby syntax

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

amount # is nil
amount ||= 0 # is 0
amount ||= 5 # is 0
Run Code Online (Sandbox Code Playgroud)

我现在需要在JavaScript中做类似的事情.什么是惯例或正确的方法来做到这一点?我知道||=语法不正确.处理它的两种明显方法是:

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

// or

if (!window.myLib)
  window.myLib = {};
Run Code Online (Sandbox Code Playgroud)

nXq*_*Xqd 135

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

  • 如果“x”的有效值为假(例如“false”),并且您只想在“x”未定义时设置默认值,请小心使用此值。 (3认同)
  • @AshwinKumarS 是的,确实如此。请参阅[文档](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_nullish_assignment)、[规范](https://tc39.es/ecma262/#sec-赋值操作符运行时语义评估),[提案](https://github.com/tc39/proposal-logic-assignment/)。 (2认同)

Mor*_*ler 21

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

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

||;


Eli*_*ria 7

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

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

  • 更新:该提案现已[完成](https://github.com/tc39/proposals/blob/master/finished-proposals.md),即它已达到第 4 阶段并包含在 ECMAScript 规范的最新草案中。它将包含在将于 2021 年发布的下一个标准中。 (6认同)
  • 我们现在生活在未来。答案应该更新 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_OR_assignment 或者我猜向下滚动有人至少添加了其他答案 (2认同)

Ink*_*ing 5

如果您正在处理对象,则可以像这样使用解构(ES6 起):

({ myLib: window.myLib = {} } = window);
Run Code Online (Sandbox Code Playgroud)

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


Mat*_*ers 5

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

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

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