javascript
循环遍历多层json_面试官:JSON.stringify() 实现深拷贝有什么问题
為什么要進行深拷貝
JS中的變量在內(nèi)存中存儲分為值類型和引用類型:
值類型:
1、占用空間固定,保存在棧中;
2、保存與復制的是值本身;
3、基本類型數(shù)據(jù)是值類型(String,Number,undefined,Boolean,Null);
引用類型:
1、占用空間不固定,保存在堆中;
2、保存與復制的是指向?qū)ο蟮囊粋€指針;
3、使用new()方法構(gòu)造出的對象是引用型;
所以像Object, Array 這樣的復雜對象的,需要進行深拷貝;
JOSN.stringify() 深拷貝有什么問題?
最簡單的深拷貝唄方式就是使用JSON.stringify();進行深拷貝;比例:
var obj={name:'大雄',age:21 }; var obj1=JSON.parse(JSON.stringify(obj));這樣深拷貝出來是完全沒有問題的;假如我們有如下的對象,進行深拷貝呢
var obj1={name:'大雄',say:function(){console.log('我會說話哦!');},birthday:new Date('1990/01/01') }; var obj2=JSON.parse(JSON.stringify(obj)); console.log(obj2); // {name: "大雄", birthday: "1989-12-31T16:00:00.000Z"}我們看到了,當我們的對象中有函數(shù)和日期類型是,日期類型被轉(zhuǎn)化成了字符串;函數(shù)屬性直接沒有了!是不是問題很大!
經(jīng)過我們測試我們發(fā)現(xiàn):
1. undefined、任意的函數(shù)以及 symbol 值,在序列化過程中會被忽略
2. Date 日期調(diào)用了 toJSON() 將其轉(zhuǎn)換為了 string 字符串(Date.toISOString()),因此會被當做字符串處理。
3. NaN 和 Infinity 格式的數(shù)值及 null 都會被當做 null。
4. 其他類型的對象,包括 Map/Set/WeakMap/WeakSet,僅會序列化可枚舉的屬性。
5. 對包含循環(huán)引用的對象(對象之間相互引用,形成無限循環(huán))執(zhí)行此方法,會拋出錯誤。
// 下面就是循環(huán)引用; var obj1 = {x: 1, y: 2 }; obj1.z = obj1; var obj2 = JSON.parse(JSON.stringify(obj1)); // 棧溢出,拋出錯誤;所以當我們要克隆的對象里面還有引用類型時,我們只能采用遞歸的方法進行遍歷了,這里就不展開了。
JOSN.stringify() 有幾個參數(shù)?
> JSON.stringify(value[, replacer [, space]])
我們主要看一下 第二個參數(shù)和第三個參數(shù)時干啥用的
replacer 可選1. 如果該參數(shù)是一個函數(shù),則在序列化過程中,被序列化的值的每個屬性都會經(jīng)過該函數(shù)的轉(zhuǎn)換和處理;
2. 如果該參數(shù)是一個數(shù)組,則只有包含在這個數(shù)組中的屬性名才會被序列化到最終的 JSON 字符串中;
3. 如果該參數(shù)為 null 或者未提供,則對象所有的屬性都會被序列化;
var obj1={x:1,y:2 }; var obj2=JOSN.stringify(obj1,function(key,value){if(typeof value == 'number'){return value*2}return value; }); // "{x:2,y:4}"我們再看一下 最后一個參數(shù):
space 可選1、指定縮進用的空白字符串,用于美化輸出(pretty-print)
2、如果參數(shù)是個數(shù)字,它代表有多少的空格;
舉個例子
var obj1={x:1,y:2}; JSON.stringify(obj1,null,'t'); "{"x": 1,"y": 2 }"我我們用制表符來進行縮緊;
原創(chuàng)不易,請大家點贊關(guān)注,十分感謝!
總結(jié)
以上是生活随笔為你收集整理的循环遍历多层json_面试官:JSON.stringify() 实现深拷贝有什么问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 减肥期间早上只吃一个苹果或香蕉可以吗
- 下一篇: 电子工程系庆贺电贺信_创造下一代光电子集