2017-10-26 22 views
6

私の反応Appを開発する際に、条件付き小道具をコンポーネントに送信する必要があったので、私はどこかのパターンを見つけたので、本当に変わってしまいました。なぜそれが働いたのですか?Javascript ES6スプレッド演算子が定義されていません

私が入力した場合:

console.log(...undefined) // Error 
console.log([...undefined]) // Error 
console.log({...undefined}) // Work 

を未定義がオブジェクトの内側にある場合が拡散演算子は、未定義のエラーが発生した上で起動されると、空のオブジェクトを返します。

私はこの動作に関して非常に驚いています。これは本当にどうしたらいいのでしょうか、これに頼ることができますか?

+0

Iteratorに依存するものは、それらの値に必要なメソッドを実装する方法がないため、 'null'または' undefined'でスローされます。なぜオブジェクトが構文を広げるのかわかりません。 – llama

+0

それを考えると、オブジェクトの文字通りの普及構文は、普及しているものがしばしば別の明白なオブジェクトであり、デフォルトでは反復子ではないので、それは意味をなさないと思うので、ほとんど例外を作らなければなりませんその場合。 – llama

+0

'{... undefined}'これはBabelでコンパイルされないので、私が使うものではありません。 – Keith

答えて

3

この動作はオプションを広げるようなことを行うために有用である:

function foo(options) { 
    const bar = { 
    baz: 1, 
    ...(options && options.bar) //options and bar can be undefined 
    } 
} 

そして、それはstage-1にある、optional chainingでさらに良くなります:

function foo(options) { 
    const bar = { 
    baz: 1, 
    ...options?.bar //options and bar can be undefined 
    } 
} 

考え:そのあまりにも悪いですが、配列に広がることもできません。

関連する問題