6

var options = options || {}空のオブジェクトをデフォルトにする方法としてよく使用します。関数呼び出しのパラメーターで渡されない場合に備えて、オプション オブジェクトを初期化するためによく使用されます。

options || (options = {})問題は、開発者の意図をより適切に表現しているいくつかの場所 (ブログ投稿、ソース コード) を読んだことです。誰かがそれについて詳しく説明できますか?この 2 つの機能の違いはわかりません。

- - 編集

https://github.com/documentcloud/backbone/blob/0.9.2/backbone.js#L273のようないくつかの場所で Backbone.js ソース コードを見ました。

jQueryのソースコードでも見たと思います。そして、繁栄した複数の J ライティング スタイル ガイドの中で。

--- 2 つのコード例を編集:

var func = function(param, options) {
   // How I do it
   var options = options || {};
   // How I should do it in the "same" way
   options = options || {};
   // The "other" way
   options || (options = {});

}
4

7 に答える 7

5

あなたが意味していると仮定すると、本当の違いはありません:

function fn(options) {
    // type a
    options = options || {};

    // type b
    options || (options = {});
}

ほとんどの場合、好みの問題ですが、(a)の方がはるかに明確だと思います。私は、LHSに割り当てがないステートメントは好きではありません。

于 2012-11-19T12:15:04.290 に答える
4

機能的な違いはありません。

2 番目の構造は、(主観的に)最初の構造よりも多くのことを行っているように見えます。

反論は、最初の構造は一般的なパターンであるため、それが何をするかをより簡単に認識できるというものです。

于 2012-11-19T12:14:04.827 に答える
3

彼らは同じことをするべきですが、もっと良い方法があります。

理論的には、値が偽の場合にのみ代入する 2 番目の方法は、代入を排除して高速化できます。実際、jsperf では (12%) であることがわかります。

実際、明示的な if ステートメントは、条件後代入と同じくらい高速です。

if(!options)
    options = {};

ブラウザ/マシンでテストを試してください

明示的な if が最も明確であり、ペナルティはないと思います。

編集:

オブジェクトが関数に渡されることを期待している場合、より良いテストは次のとおりだと思います。

if(typeof options !== 'object') 
    options = {};

これにより、オブジェクトが空であっても、後で確実にオブジェクトを取得できます。他のテスト (未定義または偽り) は、ゼロ以外の数値または空でない文字列のように、真の非オブジェクトを許可します。ただし、jsperf が示すように、これは ~15% 遅くなります。オブジェクトを処理する関数へのエントリでのみこれを行うため、これは価値のあるトレードオフであり、 always-assign よりもほとんど遅くないと主張します。

于 2012-11-19T12:30:42.750 に答える
1

両者のメカニズムは同じではありませんが、機能的な違いはありません。

最初の形式は、ローカル変数optionsをパラメーターと等しくなるように設定するoptionsか、引数に偽の値がある場合 (たとえば、指定されていない場合) は空のオブジェクトに設定します。

2 番目の形式は、options(偽でない場合) パラメーターの値に評価されます。それ以外の場合は、空のオブジェクトをそのパラメーターに割り当てた結果に評価されます。したがって、最初の形式との違いは、optionsが true の場合、代入が実行されないことです。

個人的には、2番目の形式は読みにくいバージョンだと思います

if(!options) {
    options = {};
}

機能とメカニズムの両方で同一です。

于 2012-11-19T12:16:36.400 に答える
1

機能的な違いはありません。つまり、プログラマーが実際に表現したいoptions || (options = {});ものに近いという考えです。

if (typeof options == "undefined") {
  options = {};
}

演算子は、||より明確なコードではなく、より短いコードを作成するために使用されます。

于 2012-11-19T12:17:57.553 に答える
0

間違いなく主観的ですが、2番目は使用しません。

理由: トップレベルよりも深いところにある式での代入 = 難読化だと思います。

一部の C プログラマーはそのように (以前はそうでした)、代入をより明確にするために括弧を追加するようなことを行います... 式全体がなじみのないものに見えるようにします。率直に話せるのに、なぜわざわざするのですか?

最も明確なのはおそらく次のとおりです。

if (!options) options = {};
于 2012-11-19T12:20:44.760 に答える