通过JSON.parse(JSON.stringify(obj))转换的对象中的日期(Date)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过JSON.parse(JSON.stringify(obj))转换的对象中的日期(Date)相关的知识,希望对你有一定的参考价值。

参考技术A JSON.parse(JSON.stringify()) 通过此方法确实可以实现一定程度的深拷贝,但是使用此方法,要注意对象中的字段如果是Function或者是Date格式的,深拷贝就会出现问题了。如果对象中有Function或者Date格式的数据,尽量还是不要用 JSON.parse(JSON.stringify()) 此方法来实现深拷贝。

原生js实现JSON.parse()和JSON.stringify()

- 首先JSON.stringify()是将js对象转换为JSON形式

实现思路:

通过递归调用,来实现对转换对象Object的深层value进行遍历,利用array的join实现最终字符串拼接

function myJsonStringify(obj) 
        let type = typeof obj;
        if (type !== "object" || type === null) 
            if (/string|undefined|function/.test(type)) 
                obj = " + obj + ";
            
            return String(obj);
         else 
            let json = [],
                arr = (obj && obj.constructor === Array);

            for (let k in obj) 
                let v = obj[k];
                let type = typeof v;

                if (/string|undefined|function/.test(type)) 
                    v = " + v + ";
                 else if (type === "object") 
                    v = myJsonStringify(v);
                

                json.push((arr ? "" : " + k + ":) + String(v));
            
            return (arr ? "[" : "") + String(json) + (arr ? "]" : "")
        
    

一个较为完整版的实现:

(function(NS)
var simpleTypes=["number","boolean","undefined","string","function"]
function stringify(object)
    var type=typeof object
    if(indexOf(simpleTypes,type)>-1)
        return parseSimpleObject(object);
    
    if(object instanceof Array)
        var len=object.length;
        var resArr=[];
        for(var i=0;i<len;i++)
            var itemType=typeof object[i];
            if(indexOf(simpleTypes,itemType)>-1)
                if(itemType!="undefined")
                    resArr.push(parseSimpleObject(object[i]));
                
                else
                    resArr.push(null)
                
            
            else
                resArr.push(stringify(object[i]))
            
        
        return "["+resArr.join(",")+ "]"
    
    if(object instanceof Object)
        if(object==null)
            return "null"
        
        var resArr=[]
        for(var name in object)
            var itemType=typeof object[name];
            if(indexOf(simpleTypes,itemType)>-1)
                if(itemType!=undefined)
                    resArr.push("\"" + name + "\":" + parseSimpleObject(object[name]))
                
            
            else
                resArr.push("\"" + name +"\":" +stringify(object[name]))
            
        
        return "" +resArr.join(",") +""
    

function parseSimpleObject(object)
    var type=typeof object;
    if(type=="string"||type=="function")
        return "\"" + object.toString().replace("\"","\\\"") + "\""
    
    if(type=="number"||type=="boolean")
        return object.toString()
    
    if(type=="undefined")
        return  "undefined"
    
    return  "\"" +object.toString().replace("\"","\\\"") +"\""

function indexOf(arr,val)
    for(var i=0;i<arr.length;i++)
        if(arr[i]===val)
            return i;
        
    
    return -1

NS.stringify=function(object,isEncodeZh)
    var res=stringify(object)
    if(isEncodeZh)
        var encodeRes="";
        for(var i=0;i<res.length;i++)
            if(res.charCodeAt(i)<Oxff)
                encodeRes+=res[i]
            
            else
                encodeRes+="\\u"+res.charCodeAt(i).toString(16);
            
        
        res=encodeRes
    
    return res;

)(window);

JSON.parse()是将JSON对象转换为js对象

实现方式:(2种)

eval()

var json="a":"1","b":2
 var obj=eval("("+json+")");

直接调用eval,会产生xss漏洞。

利用new Function()

第一种eval的方法,相当于无脑把JSON字符串塞进去,eval和Function都有着动态编译js代码的作用

var func=new Function(arg1,arg2,...,functionBody)
var jsonStr="age":20,"name":"jack"
var json=(new Function(return+jsonStr))()

 

以上是关于通过JSON.parse(JSON.stringify(obj))转换的对象中的日期(Date)的主要内容,如果未能解决你的问题,请参考以下文章

通过JSON.stringfy()和JSON.parse(),实现对象或者数组深拷贝

JSON.parse无双引号如何实现转换

JSON.stringify 和 JSON.parse 之间的区别

将JSON字符串从IOS Native发送到Javascript(JSON.Parse)时出现Json Parse错误[重复]

json parse 解析js function

json.stringfy()和json.parse()