インデックスが存在しない場合は未定義を回避しながらJavascriptはインデックスで配列から値を取得?

Pythonから来て、私はこのJavaScriptを見ることは非常に奇妙です:

a = []
b = a[0] 
b === undefined//returns true

Pythonではa [0]はインデックスエラーを発生させ、今後もエラーが続く可能性があり続けます。 Bが未定義に設定されることはありません。

Pythonでは、次のようなことができます。

a = [1, 2, 3]
try:
    b = a[5]
except IndexError:
    print('Index out of range')

bを未定義に設定することはできません。これにより、後で起こる可能性のある奇妙なことを防ぐことができます。 JavaScriptでこれを処理するための最良の方法は何ですか?私はこのようなことを試したいと思う傾向があります。

a = []
b = a[0] || 

aがオブジェクトのリストであると想定されている場合は、

a = []
b = a[0] || {}//set b to empty object instead of undefined

JavaScriptでこれを処理する一般的な方法は、それをさらに下のほうで処理することです。

a = []
b = a[0]

if (b) {
   //do something if b is defined
}

// or 

if (!b) {
   //do something if b is undefined 
}

JavaScriptで何かを未定義に設定しないようにするための最善または一般的な方法はありますか?アレイにアクセスするというこの特定のケースでは、何かを未定義に設定しないようにする最善の方法は何ですか?

5
ru de
const b = a [0] || <�未定義以外のもの> は完全に問題ありません。 IMOは b の再割り当てを避けるための、最も簡潔な方法です。 (不必要な再割り当てはしばしば眉をひそめます)
追加された 著者 CertainPerformance,

4 答え

in 演算子を使用できます。 演算子。条件付き(3値)演算子?: 。値またはデフォルト値のどちらかになります。

この方法では、誤った値も保存されます。

const b = 0 in aa ? a[0] : ;
3
追加された

あなたが見ているのは基本的にデザインの決定です。それがまさにJavaScriptのしくみです。例えば、PHPは存在しないインデックスへのアクセスがハードエラーではなく警告であるという意味で似ています。このように振舞う他の言語の例はおそらくそこにあります。

これを回避するには

一般的な方法は、実際に b = a [0] ||を使用することです。しかし、 "default" は、以下の例のように、不正な値で未定義の値ではない動作に注意してください。

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code">

var myarray = [ 0, null, "" ];

var a = myarray[0] || "default[0]";
var b = myarray[1] || "default[1]";
var c = myarray[2] || "default[2]";
var d = myarray[3] || "default[3]";

console.log(a, b, c, d);
</div> </div>

偽の値を使用できるようにしながら未定義を厳密にチェックしたい場合は、明示的に行ってください。

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code">

    var myarray = [ 0, null, "" ];

    var a = myarray[0] !== undefined ? myarray[0] : "default[0]";
    var b = myarray[1] !== undefined ? myarray[1] : "default[1]";
    var c = myarray[2] !== undefined ? myarray[2] : "default[2]";
    var d = myarray[3] !== undefined ? myarray[3] : "default[3]";

    console.log(a, b, c, d);
</div> </div>
1
追加された

JavaScriptの実行は他のプログラミング言語とは少し異なります。 JavaScriptは、CやJavaなどの言語が作成する中間コード(バイトコードなど)を作成しません。 Javascriptの最初のフェーズは、変数がそれぞれのスコープ内で定義されている宣言フェーズです。デフォルトのスコープはグローバルスコープです。各関数は、JavaScriptで独自のスコープを作成します。

var a = 10;

そのため、第1フェーズでは、グローバルスコープで「a」を定義します。値が10で初期化されていないことに注意してください。次のフェーズは、10という値が変数 'a'に割り当てられる初期化フェーズです。 aに値が宣言されていない場合は、 '未定義' として初期化されます。

最後に、JavaScriptがそれを実行するのとまったく同じ方法であることを覚えておく必要があります。

1
追加された

JavaScriptの将来のリリース(現在の日付7/16/18)では、無効な合体が利用可能になるはずです。

の代わりに:

value != null ? value : 'default value';

または

value || 'default value'

(2番目の解決策では、数値ゼロ、ブール値のfalse、空の文字列はすべてfalseと見なされます。非常に危険です。)

今できること:

value ?? 'default value';

Docs: https://github.com/tc39/proposal-nullish-coalescing

0
追加された
JavaScript - 日本のコミュニティ
JavaScript - 日本のコミュニティ
2 参加者の

日本人コミュニティのjavascript