JavaScriptでのRubyの|| =(または同等)?


128

Rubyの||=メカニズムが大好きです。変数が存在しないかである場合は、変数nilを作成し、それを何かに等しく設定します。

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

私は今、JavaScriptで同様のことをする必要があります。これを行うための慣習または適切な方法は何ですか?||=構文が無効であることはわかっています。それを処理する2つの明白な方法は次のとおりです。

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

// or

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

回答:


152

どちらも完全に正しいですが||=、ルビのように機能するものを探している場合は、最初の方法はvariable = variable || {}あなたが探しているものです:)


の有効な値xがのようfalseに偽であり、xが未定義の場合にのみデフォルトを設定する場合は、これを慎重に使用してください。
ジョシュアピンター

22

が偽の値である||場合lValは、右のオペランドを評価する論理OR演算子を使用できます。

偽の値には、 null, false, 0, "", undefined, NaN

x = x || 1

の有効な値xがのようfalseに偽であり、xが未定義の場合にのみデフォルトを設定する場合は、これを慎重に使用してください。
ジョシュアピンター

4

オブジェクトを使用している場合は、(ES6以降の)分解を次のように使用できます。

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

...しかし、混乱を除いて、あなたは受け入れられた答えに対して何も得ません。


1
「しかし、あなたは受け入れられた答えに対して混乱を除いて何も得ません」-いいですね。:)
lindes

私は誰かがjavascriptを憎む理由としてこれを採用するつもりです
Volper

1

あなたが尋ねた演算子はJavaScriptの機能として提案されています。これは現在ステージ3にあるため、まだ言語の正式な部分ではありませんが、受け入れられるようになり、予期しない大きな問題が発見された場合はほとんど変更されません。

plugin-proposal-logical-assignment-operators Babelプラグインを使用してこれを使用できます。私はそのプラグインを使用したことがないので、それがどれほどうまく機能するかわかりません。


-1

Rubyの|| =演算子の短絡の割り当て。これは次のように考えることができます:

return a || a = b

したがって、JavaScriptでは、これは非常によく似ています。

return a || (a = b);

ただし、以下のコメントで指摘されているように、このリテラルのルビ形式は、標準のJavaScriptイディオムa = a ||よりも効率が悪いようです。b。

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


1
実際には、a = a || bフォームがより最適であるようですjsperf.com/x-or-x-equals-0-vs-x-equals-x-or-0/3
jchook

ああクールなツール。xに値があり、短絡している場合、どのように見えますか?
クリス2016年

このテストでは短絡パフォーマンスを示す必要があるので、分解はjsperfで明示的に行う必要があると思います。私の推測では、V8にはフォームの特別な最適化がありますa = a || b
jchook 2016年

3
FYIそこにあった違いはすべて最適化されているようです。
チャールズウッド

a || (a = b)関数名を推測するための正しいセマンティクスがあります。新しい提案については現在議論中です。
user4642212

-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]

質問はに関するものではありません||=。問題の望ましい動作は、ビット単位の演算とは無関係です。
user4642212

あなたは正しい私はそれに応じて答えを編集します
wallgeek

編集。私はそれが今理にかなっていると思います。
wallgeek
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.