我喜欢Ruby的||=
机制。如果变量不存在或者是nil
,则创建它并将其设置为等于:
amount # is nil
amount ||= 0 # is 0
amount ||= 5 # is 0
我现在需要在JavaScript中做类似的事情。什么是惯例或正确的方法来做到这一点?我知道||=
是无效的语法。处理它的两种明显方法是:
window.myLib = window.myLib || {};
// or
if (!window.myLib)
window.myLib = {};
答案 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)
答案 5 :(得分:0)
从 2021 年开始,只要您正在转译或不关心 Opera/IE,您就可以使用行为与 Ruby 相同的 ||=
。
逻辑 OR 赋值,||=
现在在除 Opera 和 IE 之外的所有主要浏览器的 javascript 中都得到原生支持。 Current caniuse matrix。 MDN 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