拡張演算子「spread」の会話


原文のリンク-航洋無声-Github
拡張演算子は、見た目がレストパラメータと似ていますが、3つのポイントです.
拡張演算記号は、2つの場合に分けられます.
  • iterable「一般的には配列」
  • enumerable「一般的な状況を対象とする」
  • 標準ES 2015では、iterableデータに対してのみ拡張演算子を実現し、iterableデータのデータ系列をカンマで分割されたパラメータシーケンスに変換する.
    たとえば:
    let array = [5, 12]
    let arrayCopy = [11, ...array]
    //        :let arrayCopy = [11, 5, 12]
    // arrayCopy ==> [11, 5, 12]
    
    console.log(...[5, 12])
    console.log(5, 12)
    //    2        
    //        :5 12
    上の2つの列を通して、「拡張演算子の結果は、カンマ区切りのパラメータ系列」の意味がよりよく理解されるはずです.
    ただし、注意すべき点があります.非iterableデータは拡張演算子を実行し、エラーが発生します.
    ES 7のある提案では、拡張演算子はenumerableデータを導入します.
    たとえば:
    let obj = {name: 'hangyangws'}
    let objCopy = {...obj}
    console.log(objCopy) //   :{name: 'hangyangws'}
    実はenumerableデータの拡張演算子の下の実装はObject.assignを利用しています.
    Object.assign(targt,…sources)に詳しいです.2つの特徴があります.
  • sourcesパラメータが「オリジナルタイプ」であれば、「対象」
  • に包装されます.
  • sourcesパラメータはnullとundefinedであれば無視されます.
    たとえば:
    Object.assign({}, null) //    :{}
    Object.assign({}, undefined) //    :{}
    
    Object.assign({}, 0) //    :{}
    Object.assign({}, 'FJ') //    :{0: "F", 1: "J"}
    //            :
    //                      
    //   「  」,    null、undefined   
    拡張演算子が2つある以上、JSインタプリタはどのようにして使うのか分かりますか?したがって、拡張演算子はコードの具体的な実行文脈によって判断されます.
    たとえば:
    let test = [...null]
    //   :null is not iterable
    
    let test = {...null}
    // test ===> {}