先来看一个例子

例一:

var a=[1,2,3];
var b=a;
b.push(4);
alert(b);//1,2,3,4
alert(a);//1,2,3,4
var a=[1,2,3];
var b=a;
b=[1,2,3,4]
alert(b);//1,2,3,4
alert(a);//1,2,3

这两种方法得出的结果是不一样的。

第一个程序,是对象的引用, 把a的值附给b,a与b之间是引用的关系,当两者之间是引用的关系时,改变任一变量,都会影响另一个变量。

第二个程序,只是对b的值改变,虽然b=a ,但是当改变b的值时,又重新建立了一个地址,这个地址与a无关,所以在改变b值时,与a无关,这有点类似于C中的指针

再来看一个例子

例二:

var a={
name:'hello'
};
var b=a;
b.name='hi';
alert(a.name);//当然了,这个结果肯定是hi

如何解决上面的问题呢?

var a={
name:'hello'
};
function copy(a){
var b={};
for(var attr in a){
b[attr]=a[attr]
}
return b
}
copy(a).name='hi';
alert(a.name); //这时的结果就是hello了

上面的方法叫浅拷贝,利用for in 把a中属性拷贝给b,但是只是拷贝了一个副本,实际上当修改b的值是不会改变a的值的。当然有浅拷贝就有深拷贝。

var a={
name:{value:'world'}
}
function copy(a){
var b={};
for(var attr in a){
b[attr]=a[attr];
}
return b
}
copy(a).name.value='space';
alert(a.name.value); //这时的结果是space

这时候大家或许或纳闷,用了拷贝了怎么结果还是space呢!因为JSON里面又有一个 value:'world' 这个类型是一个对象,你拷贝过来还是对象,还是对象的引用,所以结果就是space,当然了,或许有会说那就再用一次copy就行。由结果再调用一次copy,对了,就是递归的含义,在函数内部调用函数本身。稍微修改一下程序即可

var a={
name:{value:'world'}
}
function deepCopy(a){
if(typeof a!='object'){
return a
}
var b={};
for(var attr in a){
b[attr]=deepCopy(a[attr]);
}
return b
}
deepCopy(a).name.value='space';
alert(a.name.value); //这时的结果就是world

改的地方有两处,1、执行函数内部调用函数本身   b[attr]=deepCopy(a[attr])   2、终止条件typeof a!='object'  就像上面说的,你用浅拷贝拷的是对象,终止条件就是检测类型不是对象的时候,返回a的值。这样就解决了问题。 上面的方法就是深拷贝

例三:

现在了解了浅/深拷贝,想用HTML5方法去解决。在解决之前,我们很有必要去了解HTML5之前如何将字符串转换成js语句,如下:

var str='function task(){alert('hello')}'
var fn=eval(str);
task(); //hello

HTML5如何把JSON格式的字符串转成JSON对象,用JSON.parse() 如下:

var a='{
'name':'hello';
};'
var json=JSON.parse(a);
alert(json.name); //hello

这个name上加了 ' '  不加' ' 是不严格的JSON,JSON.parse 方法要求必须是严格的JSON

如何将JSON对象转成JSON格式的字符串呢,用JSON.stringify()  如下:

var a={
name:'hello'
};
var json=JSON.stingify(a);
alert(json); // '{'name':'hello'}'
这时的结果就是 '{'name':'hello'}',这时候就明白了为什么要用严格的JSON格式了

那么用HTML5怎么解决问题呢,那就先把JSON转成字符串,再把JSON格式的字符换转成对象,实际上引用的还是a的副本,并没有真正引用a。这就和拷贝中的
副本原理是一样的。如下:
var a={
name:'hello'
};
var str=JSON.stringify(a);
var obj=JSON.parse(str);
var b=obj;
b.name='hi';
alert(a.name);//hello
拓展:

这种方法实际上在8以下是不兼容的,如何兼容呢,就是引用一个json文件:json2.js,如下

<script type='text/javascript' src='json2.js'></script>
 

用浅/深拷贝、和HTML5方法解决js对象的引用的问题的更多相关文章

  1. json转js对象方法,JS对象转JSON方法

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  2. JS对象的引用,对象的拷贝

    目录 一.场景 二.浅拷贝 三.深拷贝 一.场景 除了基本类型跟null,对象之间的赋值,只是将地址指向同一个,而不是真正意义上的拷贝 将一个对象赋值给另外一个对象. var a = [1,2,3]; ...

  3. 递归 与 js 对象的引用

    <script> //递归 function test(n) { if (n == 1) { return 1 } console.log(n) return n * test(n - 1 ...

  4. 让javascript加载速度倍增的方法(解决JS加载速度慢的问题)

    通常我们的网站里面会加载一些js代码,统计啊,google广告啊,百度同盟啊,阿里妈妈广告代码啊,一堆,最后弄得页面加载速度很慢,很慢. 解决办法:换一个js包含的方式,让javascript加载速度 ...

  5. MVC扩展Url.Action方法解决复杂对象参数问题

    1:问题描述 @Url.Action("Index", "Home", new { Key = "Key", Val = new { Nam ...

  6. js对象的引用

    /*var a = [1,2,3]; var b = [1,2,3]; alert( a == b ); //false*/ //基本类型:赋值的时候只是值得复制 /* var a = 5; var ...

  7. javascript基础-js对象

    一.js对象的创建 1.普通最简单的方式 var teacher = new Object( ); teacher.name = "zhangsan"; teacher.age = ...

  8. js对象,原型,call,apply浅析

    //对象直接量,创建对象最简单的方式是在js里使用对象直接量 var book = { "main title": "js", //属性里有空格,要用引号 &q ...

  9. 9、Cocos2dx 3.0游戏开发三查找值小工厂方法模式和对象

    重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27704153 工厂方法模式 工厂方法是程序设计中一个 ...

随机推荐

  1. Linux下的C程序如何调用系统命令,并获取系统的输出信息到C程序中

    直接贴代码: #include <stdio.h> #include <string.h> #include <errno.h> int main(int argc ...

  2. sql datalength与len区别用法

    原文:sql datalength与len区别用法 len ( string_expression )参数:要计算的字符串 len() 函数len 函数返回文本字段中值的长度. sql len() 语 ...

  3. 【转】Android 系统菜单与自定义菜单

    Android 系统菜单与自定义菜单实现方法如下:系统菜单显示DefaultMenu.java package com.wxz.menu; import com.wxz.menu.R; import  ...

  4. 使用Json实体类构建菜单数据

    基于MVC4+EasyUI的Web开发框架经验总结(3)- 使用Json实体类构建菜单数据 最近花了不少时间在重构和进一步提炼我的Web开发框架上,力求在用户体验和界面设计方面,和Winform开发框 ...

  5. java UDP网路编程

    大家都知道java中的socket网络编程,而其采用的协议分别有tcp和udp协议两种. 通常的理解tcp协议类似于打电话,udp类似于发短信.前者是线程安全的,但是效率比较低.后者则刚好相反. 今天 ...

  6. AutoPostBack通过现象看本质

    在做人事档案管理系统时遇到一个功能需要实现前台数据(实时)与后台进行交互,解决这个问题首先想到的是应用控件的AutoPostBack属性.本以为这个问题就这样解决了(不用javascript.jque ...

  7. iOS基础 - Quartz 2D绘图的基本步骤

    一.使用Quartz 2D绘图的基本步骤 1) 获取上下文context(绘制图形的地方) 2) 设置路径(路径是用来描述形状的) 3)  将路径添加到上下文 4)  设置上下文属性(设置颜色,线宽, ...

  8. Web API 2

    Asp.Net Web API 2 官网菜鸟学习系列导航[持续更新中]   前言 本来一直参见于微软官网进行学习的, 官网网址http://www.asp.net/web-api.出于自己想锻炼一下学 ...

  9. Javascript:看 Javascript 规范,学 this 引用,你会懂的。

    目录 背景this待分析程序先看一个语言规范方法调用备注 背景返回目录 Javascript 的 this 是我的心病,多数情况下知道其运行结果,个别变态的场景下,就给不出解释了,昨天一次偶然的机遇让 ...

  10. linux挂载分区

    [root@localhost ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/xvda2 36G .3G 32G % / tmpf ...