天天看點

JSON.stringify 深拷貝的弊端以及常用場景

前言

深拷貝不僅将原對象的各個屬性逐個複制出去,而且将原對象各個屬性所包含的對象也依次采用深拷貝的方法遞歸複制到新對象上

弊端

  1. 如果 obj 的屬性有時間對象,則 JSON.stringify 後再 JSON.parse 的結果,時間将轉為字元串的形式,而不是對象的形式
  2. 如果 obj 的屬性有 RegExp (正規表達式的縮寫)、Error 對象,則序列化的結果将隻得到空對象;
  3. 如果 obj 的屬性有函數(function),undefined,Symbol, 則序列化的結果會把 function 或 undefined 丢失;
  4. 如果obj 的屬性有 NaN、Infinity 和 -Infinity,則序列化的結果會變成 null
  5. JSON.stringify() 隻能序列化對象的可枚舉的自有屬性,例如如果 obj 中的對象是有構造函數生成的, 則使用 JSON.parse(JSON.stringify(obj)) 深拷貝後,會丢棄對象的 constructor;
  6. 如果對象中存在循環引用的情況也無法正确實作深拷貝,并且會導緻死循環,最後抛出異常

其他常用場景

  1. 判斷數組是否包含某對象: 将數組和要比對的對象轉換成字元串後,比對字元串包含關系。(對象順序很關鍵)
  2. 判斷對象是否相等(對象順序很關鍵)
  3. 讓 localStorage / sessionStorage 可以存儲對象