33

のようだ:

if (typeof a == 'undefined') {
    a = 0;
}

(typeof a != 'undefined') || (a = 0)

Javascriptでも同じ効果があります。

2 つ目のコードは 1 行の短いコードなのでとても気に入っていますが、これは合法であり、クロス ブラウザーで有効ですか? つまり、jslint はエラーがあると言っています。気にせず使えばいいの?

4

10 に答える 10

76

私見|| (a = 0)はあまりにも似ているため|| (a == 0)、混乱します。ある日、熱狂的な開発者は単に「修正」して、コードの意味を変えてしまうでしょう。そして、他のすべての開発者は、これが意図したものなのか、単純なバグなのかを判断するために、しばらく待つ必要があります。

そして、これは実際にJSLintが言おうとしていることです:

条件式が必要でしたが、代わりに代入が見られました。

読みやすさを損なうため、混乱を招く構造の使用は避けます。a = a || 0;より認識しやすく、意味が似ています。

于 2012-09-28T07:23:05.560 に答える
31

次のようなもっと単純なものではないでしょうか。

a = a || 0;

また

a = a ? a : 0;

どちらの場合もa、行の先頭で何かが に割り当てられていることを明確に確認できます。全体を読んだり、ゲームを変える関数呼び出しがどちらかで起こっているかどうかを調べたりする必要はありません。左側または右側...または、プログラム全体の潜在的な変更がいくつあるかを決定するために、一般的に両側が何をするかを理解します。

型チェック全体を含める必要がある場合でも、それほど大きくはありません。

a = (typeof a !== "undefined") ? a : 0;  // [parentheses are there for clarity]
于 2012-09-28T07:29:02.237 に答える
9

これは合法であり、クロスブラウザは有効ですか?

はい、すべてのEcmaScriptエンジンで動作します。ただし、ifステートメントとして短絡評価を(乱用)使用することは非常にまれです。

つまり、jslintはエラーがあると言っています。気にせず使うべきですか?

いいえ、JsLintは正しいです。少なくとも他の開発者にとっては、それは珍しくて混乱を招きます。OR条件に非常に似ていますが、「本体」はありません。また、割り当てを行う場合、変数は式の内部ではなく、ステートメントの先頭にあることが期待されます。

2つ目は短いので、1行のコードが本当に好きです。

次に、

if (typeof a == 'undefined') a = 0;
于 2012-09-28T12:19:12.423 に答える
2

以下を使用できます。

a = typeof(a) !== "undefined" ? a : 0; 
于 2012-09-28T09:25:12.057 に答える
1

このような構造を使うのはひどいことだと思います。動作しますが、コードを読み取ることができません。1行の条件を記述したい場合は、CoffeeScriptの使用を開始して次のように記述できます。

a = 0 if (typeof a == 'undefined');

あなたの場合、条件と代入に1つの変数がある場合は、1行のjavascript三項演算子を使用します。

a = (typeof a == 'undefined') ? 0 : a;
于 2012-10-08T13:34:28.087 に答える
1
(typeof a != 'undefined') || (a = 0)

は表現です。しかし、その部分式の 1 つ

(a = 0)

課題です。本質的に、これは副作用のある式です。副作用のあるステートメント (特に式であるステートメント) は、通常、コーディングの入門クラスで最初に習わないことの 1 つです。では、1行しかかからないという理由だけで、なぜそれを行うのでしょうか?

于 2012-10-11T22:08:49.123 に答える
1

1 行のコードを好む理由をお聞きしてもよろしいですか?

人間として、私は読みやすいコードを好みます。私のマシンは、短くて速いコードを好みます (読み込みと実行が簡単です)。

現在、UglifyJS のようなミニファイアーはコードを短縮する方法を知っているため、両方を使用でき、このレベルの詳細について心配する必要はありません。あなたのコードを UglifyJS に渡しました。出力は次のとおりです。

typeof a=="undefined"&&(a=0)

ここで試すことができます:

http://marijnhaverbeke.nl/uglifyjs

[更新] 私の個人的な好みは (読みやすさを念頭に置いて)、選択肢がある場合に if を使用することです。フォールバック用。あなたの特定の例はフォールバックのようです( a が存在しないか未定義の場合、 a に値 0 を割り当てます)ので、|| を使用します。コメントで述べたように、 (var a=0) は、変数 a がまだ宣言されていない場合 (コンテキストがわかりません) には、より意味があります。

于 2012-10-05T16:06:23.807 に答える
1

a || a=defaultjavascript は引数の数を強制しないため、文体的には、次のようにデフォルト値を設定することは、関数へのエントリの一般的なイディオムです。

この構造が他の状況で使用されると、可読性が損なわれます。実際には、if/else を意味します。

以前はスタイルによってパフォーマンスが異なっていましたが、今日の簡単なテストでは、if/else と論理演算子は同じ速度でしたが、3 項演算は遅くなりました。

于 2012-09-28T09:59:16.693 に答える
0

私は何年もの間「IFの代わりに||」を嫌っていました。

私はついにそれに慣れました、そして今私はそれが大好きです。

&&も同じように使うのが好きです。

自分で簡潔な方法を採用すると、他の簡潔なコードを読むのがはるかに簡単になることがわかりました。

しかし、他の人がどこから来ているのかを完全に理解してください。自分でそこに行った。

于 2012-10-05T14:26:27.927 に答える
0

さらに、パフォーマンスに影響を与えると思います。

(typeof a != 'undefined') || (a = 0)

は 2 つのテストで構成されています (2 つ目のテストは気にしませんが)。

一方

if (typeof a == 'undefined') {
    a = 0;
}

1 つのテストのみを含む

于 2012-10-05T17:40:30.933 に答える