1

今日、この質問は私が取り組んでいるプロジェクトについて出てきました。「問題」は、提供されたデータに不確実性があり、その上にアプリケーションを構築していることです。これは、一部の値が存在する場合と存在しない場合があることを意味します。上位レイヤーにある程度の一貫性が必要なため、必要な一貫性を作成する「サニタイズ」メソッドを作成しました。

しかし...何が良いですか?:

var myNewData = {};
myNewData['somevalue'] = (myOldData.somevalue) ? myOldData.somevalue : '';

また

var myNewData = {};
myNewData['somevalue'] = myOldData.somevalue || '';

そして...なぜそれが良いのですか?パフォーマンスですか?読みやすさ?ちょっと興味があるんだけど。

編集:明確にするために。'somevalue' プロパティは必ずしも古いデータにある必要はありません。そうである場合もあるし、そうでない場合もある。

EDIT2:もちろん、古いデータの値に文字以外の値(数値、ブール値など)が含まれていることがわかっている場合は、デフォルトで適切な値(0、trueなど)に設定します。

4

6 に答える 6

2

読みやすさを目指す必要があり、この場合は||明らかに勝ちます。

Javascript のパフォーマンスは、実装によって大きく異なる可能性があり、時には結果が完全に非論理的であるため、予測が非常に困難です (正式に 3 回のルックアップを必要とするものは、1 回を必要とするものよりも高速になる可能性があります。これは、ランタイム エンジンがそのために特化されている可能性があるためです)。コード パス)。

于 2012-04-18T07:40:14.617 に答える
1

この手順のパフォーマンステストを実行しました。

myNewData['somevalue'] = (myOldData.somevalue) ? myOldData.somevalue : ''
myNewData['somevalue'] = (myOldData.somevalue) || ''

そしてボーナスとして古い if

if (myOldData.somevalue)
    myNewData['somevalue'] = myOldData.somevalue
else
    myNewData['somevalue'] = '';

myOldData.somevalue空かどうかの両方。このようなテストの場合:

for (i = 0; i < 10; ++i) {
    for (j = 0; j < 100000000; ++j) {
        result = empty || "";
    }
}

外側のループは平均を計算することです(タイミングコードは省略されています)。これらは私の結果です(インデックスが低いほどパフォーマンスが向上します):

コード| 空| 空ではない
      | IE9クローム| IE9クローム
-------------------------------------------------- --------
?:| 1435.1 551.1 | 1636.1 706.1
|| | 1450.3 488 | 1623.7 706.4
場合| 1436.2 491 | 1642.6 653.6
-------------------------------------------------- --------

したがって、ここではパフォーマンスは重要ではないと思います(とにかく、より良いテストでは、テストする変数がより複雑なものであるかどうかを確認する必要があります)。

読みやすさは非常に意見に基づいたものです。個人的には||、それが十分に明確で短いので好きですが、Cプログラマーを選ぶと、おそらく彼はそれを気に入らないでしょうが、C#プログラマーはそれが彼の ??オペレーターのようであると理解します...

于 2012-04-18T08:16:36.170 に答える
1

問題:

myNewData['somevalue'] = myOldData.somevalue || '';

つまり、myOldData.somevalue許容可能な偽の値を保持している場合でも、空の文字列が得られます。

したがって、最初のものを使用すると、少なくとも厳密なチェックを行って、より適切に制御できます。

(myOldData.somevalue !== false) ? myOldData.somevalue : '';
于 2012-04-18T07:37:39.360 に答える
1

どちらも同じくらい良いと思います。

ただし、文字列値を含むマップに対してのみ機能することに注意してください。古いマップにfalsenullまたはの値が含まれている場合0、それらは空の文字列に変換されます。

したがって、私は一般的なケースを好む傾向があります。

myNewData['somevalue'] = (myOldData.somevalue != undefined) ? myOldData.somevalue : '';

ただし、文字列のみを処理している場合は、myOldData.somevalue || ''簡潔で簡単に見えます。

于 2012-04-18T07:38:48.057 に答える
1

myOldData.someValue が false (null、undefined、0、'' など) の場合、どちらも '' を返しますが、最初のものはコピー/貼り付けエラーの影響を非常に受けやすくなっています。可能な限り 2 番目の形式を使用し、すべての誤った回答をデフォルト値に結合しても問題ない場合に使用します。

ベース オブジェクト -- myOldData-- が null または未定義の可能性がある場合、それはまったく別の球技であり、次のようなことを行う必要があることに注意してください。

myNewData.somevalue = ( myOldData && myOldData.someValue ) || '';

myOldDataこれはそれがオブジェクトであることを前提としています。文字列または数値の場合、ここで問題が発生する可能性があります。(そして、不要な括弧は常に良い考えです。)

于 2012-04-18T07:40:54.950 に答える
0

変わりはない。

パフォーマンス?無視できる。

読みやすさ?あなたは自分自身で、あなたやあなたの同僚に読みやすいことを言うことができます。短い方がいいです。

2つ目は、同じことを繰り返す必要がなく、エラーが発生する可能性が少ないという点で優れています。同時に、以前は静的型の言語を使用していた人にとっては珍しいことです。

于 2012-04-18T07:40:59.273 に答える