136

I love Ruby's ||= mechanism. If a variable doesn't exist or is nil, then create it and set it equal to something:

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

I need to do something similar in JavaScript now. What's the convention or proper way to do this? I know ||= is not valid syntax. 2 obvious ways to handle it are:

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 に答える
5

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

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

...しかし、混乱を除いて、受け入れられた答えよりも何も得られません。

于 2017-06-06T02:26:48.817 に答える
2

2021年現在、||=トランスパイルするか、Opera/IEを気にしない限り、Rubyと同じ動作で使えます。

論理 OR 代入は、||=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);

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

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

于 2015-11-25T04:37:14.093 に答える