14、JSON、拷贝

一、JSON

JSON:JavaScript Object Notation

JSON是一个字符串 常常用于网络传输数据的一种字符串格式(js中的所有数据用引号引起来就是JSON)

querystring 查询字符串  "name=karen&pwd=abc123&count=20"

template 模板字符串 `<div style="">666</div>`

JSON  json字符串 '{"name":"karen","its":["hello","h5"]}'         

            var re='{name:"karen","its":["hello","h5",{"xx":20}]}'

            var re='[10,203,4]'

            var re=1000

            var re='"hello"'

            console.log(typeof re)

            var obj=JSON.parse(re)   //可以把字符串转换为对象

            console.log(re,obj)

//以上都是JSON

       JSON解析

            var obj=JSON.parse(re)  //可以把字符串转换为对象

            console.log(re,obj)

            var obj={name:"karen"}

            var str=JSON.stringify(obj)   //返回值是字符串

            console.log(str)  //{"name":"karen"}

            var obj={age:20}  //存数据

            obj["age"]        //取数据加引号

二、对象的深拷贝


对象属性们 Object.keys(obj1)返回数组装的obj1的所有成员名
var obj={name:"jack"},a="name";obj[a]可以取到"jack"

Object.prototype.copy1=function () {
    //设计代码 让它有如下功能
}
var obj={name:"karen",infos:[{img:"xx",count:20}]}
var obj2=obj.copy1()
obj2.infos[0].count=30
console.log(obj.infos[0].count)//30

var obj3=obj.copy1(true)
obj3.infos[0].count=40
console.log(obj.infos[0].count)//30
console.log(obj3.infos[0].count)//40

//方法1. 最简单的方式,缺陷是原型链没有拷贝 函数和null不会拷贝

var copy1 = function (obj) {
    return JSON.parse(JSON.stringify(obj));
}
var a = {a:function(){console.log('hello world')},b:{c:1},c:[1,2,3],d:"wanger",e:new Date(),f:null,g:undefined}
var b = copy1(a)

//方法2.利用自调用

var copy1 = function (obj) { 
    if(obj === null) return null 
    if(typeof obj !== 'object') return obj;
    if(obj.constructor===Date) return new Date(obj); 
    if(obj.constructor === RegExp) return new RegExp(obj);
    var newObj = new obj.constructor ();  //保持继承链
    for (var key in obj) {
        if (obj.hasOwnProperty(key)) {   //不遍历其原型链上的属性
            var val = obj[key];
            newObj[key] = typeof val === 'object' ? arguments.callee(val) : val; // 使用arguments.callee解除与函数名的耦合
        }
    }  
    return newObj;  
}; 

		//对象深拷贝1(如果内部没有引用数据或者时间正则null等等数据时)
			var obj={name:"karen"}			
			// var obj2={}
			// obj2.name=obj.name			
			var str=JSON.stringify(obj)//'{"name":"karen"}'	
		    var obj2=JSON.parse(str)//{name:"karen"}	
			console.log(obj2,obj==obj2)//{name:"karen"}  false
	// 对象深拷贝2(笔试题中经常出现-跟垂直水平居中)
			
			var obj={x1:null,x2:new Date(),x3:"hello",son:{age:20}}
			var obj2=JSON.parse(JSON.stringify(obj))
			obj2.son.age=300
			console.log(obj2,obj)
			
			var dt=new Date()
			var dt2=JSON.parse(JSON.stringify(dt))
			console.log(typeof dt2)
			
			var obj={name:"karen",its:[10,20,30]}//[10,20,30,[90,100]]//null//"hello"//{x1:null,x2:new Date(),x3:"hello",son:{age:20}}
			var obj2=new Person()			
			function deepcopy(data){
				//number
				 if(typeof(data)=="object"){
					 if(data.constructor==Date){
						 return new Date(data.getTime())
					 }
					 else if(data==null){
						 return null
					 }
					 else if(data.constructor==RegExp){
						  return new RegExp(data)
					 }
					 else if(data.constructor==Array){
						  var newArray=new Array()
						   for(var i=0;i<data.length;i++){
							   var temp=data[i]					   
							   newArray.push(arguments.callee(temp))
						   }
					 	   return newArray
					 }
					 else{
						 var newobj=new data.constructor() //new Object()
						 // Object.keys()
						 for (var key in data) {							
						 	newobj[key]=arguments.callee(data[key])
						 }
						 return newobj
					 }
				 }
				 else{
					return data 
				 }
			}
			var obj2=deepcopy(obj)
			// console.log(obj2,obj==obj2,obj[3]==obj2[3])
			console.log(obj2,obj==obj2,obj.its==obj2.its)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值