JavaScript Object Notation
1、JSON是一个字符串 常常用于网络传输数据的一种字符串格式
区别:
querystring 查询字符串 "name=karen&pwd=abc123&count=20"
template 模板字符串 `<div style="">666</div>`
JSON json字符串 '{"name":"karen","its":["hello","h5"]}' (' ')
2、JSON解析 parse(字符串解析),stringify(转成字符串)
- var re='{"name":"karen","its":["hello","h5",{"xx":20}]}'
- var obj=JSON.parse(re)
- console.log(re,obj)
-
- var obj={name:"karen"}
- var str=JSON.stringfy(obj)
- console.log(str)
- var obj={age:20}
- obj["age"]
3、注意:
JSON
对象和数组的属性名必须是双引号括起来的字符串,并且最后一个属性后不能有逗号。
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、自己设计deepcopy函数
- 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)
- 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;
- };