`

浅谈Javascript 中几种克隆(clone)方式

阅读更多

一:在Javascript里,如果克隆对象是基本类型,我们直接赋值就可以了:

var sStr = "kingwell";
var cStr = sStr;
 alert(cStr);//输出kingwell
sStr = "abc";
alert(cStr);//输出kingwell;

 把一个值赋给另一个变量时,当那个变量的值改变的时候,另一个值不会受到影响。

 

二:如果不是基本类型,那就有所有不同了:

var aArr = [0,1,2,3];
var m = aArrr;
alert(m);//输出1,2,3
aArr=[1,1,2,3];
alert(m);//输出1,1,2,3;这个值改变了,因为m只是aArr的一个引用,如果aArr的值改变了,那么m也会相应的改变。

 如果我们想克隆一个数组,最简单的办法:

var aArr = [0,1,2,3];
var m = aArr.slice(0);
aArr = [3,2,1,0];
alert(m);//输出0,1,2,3,这时虽然aArr中的值已经改变,但是因为使用slice方法已经创建一个新的数组。

 

我们可以创建一个函数来克隆所有对象:

 

function clone(obj) {
	var o;
	if (typeof obj == "object") {
		if (obj === null) {
			o = null;
		} else {
			if (obj instanceof Array) {
				o = [];
				for (var i = 0, len = obj.length; i < len; i++) {
					o.push(clone(obj[i]));
				}
			} else {
				o = {};
				for (var j in obj) {
					o[j] = clone(obj[j]);
				}
			}
		}
	} else {
		o = obj;
	}
	return o;
}

 三:节点克隆:

var p = document.getElementsByTagName("p")[0];
var cP = p.cloneNode();//克隆p节点
var cP = p.cloneNode(true);//克隆p节点,深度克隆,克隆节点以及节点下面的子内容。
2
1
分享到:
评论
5 楼 kingwell.leng 2012-09-13  
lazy_ 写道
lazy_ 写道
引用
<script>
  var aArr = [0,1,2,3];
var m = aArr;
alert(m);//输出1,2,3
aArr=[3,2,1,0];
alert(m);//输出3,2,1,0;这个值改变了,因为m只是aArr的一个引用,如果aArr的值改变了,那么m也会相应的改变。
</script>


请不要误导新人,你确信你测试过这段代码?你确定你理解引用的概念?

语气重了点,不好意思,我通常都这样,要么不写,要么充分验证才发布。


呵呵,有问题可以纠正。。。
4 楼 lazy_ 2012-09-13  
lazy_ 写道
引用
<script>
  var aArr = [0,1,2,3];
var m = aArr;
alert(m);//输出1,2,3
aArr=[3,2,1,0];
alert(m);//输出3,2,1,0;这个值改变了,因为m只是aArr的一个引用,如果aArr的值改变了,那么m也会相应的改变。
</script>


请不要误导新人,你确信你测试过这段代码?你确定你理解引用的概念?

语气重了点,不好意思,我通常都这样,要么不写,要么充分验证才发布。
3 楼 kingwell.leng 2012-09-11  
chenweick 写道
数组克隆的话建议用var m=aArr.contact()来实现,这样可以保留aArr本身

现在aArr也没有变,如果不刻意改变的话,你说的是concat吧,没这个函数contact吧
2 楼 Lovic 2012-09-11  
ttttttttttttttttttttt
1 楼 chenweick 2012-09-11  
数组克隆的话建议用var m=aArr.contact()来实现,这样可以保留aArr本身

相关推荐

    Java中的克隆(Clone)机制

    总结来说,Java中的克隆机制提供了一种创建对象副本的方式,分为浅克隆和深克隆两种形式,适用于不同的对象结构需求。正确理解和使用克隆机制,可以帮助开发者更有效地管理和复制复杂的数据结构,避免因共享数据导致...

    java 深克隆与浅克隆

    Java 深克隆与浅克隆 Java 中的克隆机制可以让我们方便地制造出一个对象的...Java 中的克隆机制可以方便地制造出对象的副本,但是需要注意浅克隆和深克隆的区别,并且需要正确地使用 Clone 方法,以避免不利的结果。

    java 深克隆 浅克隆

    浅克隆是通过实现`Cloneable`接口并覆盖`Object`类中的`clone()`方法来实现的。当一个对象被浅克隆时,新创建的对象会拥有原始对象的所有字段的副本,但是这些字段如果是引用类型(比如对象),则新旧对象共享同一...

    clone 深度克隆对象

    在Java中,实现深度克隆通常有两种方式:一是通过实现Cloneable接口并重写Object类的clone()方法;二是使用序列化和反序列化技术。前者需要特别注意的是,只有实现了Cloneable接口的类才能调用默认的clone()方法,...

    克隆管理CLONE克隆管理克隆管理克隆管理

    克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理...

    Java深浅clone

    在本文中,我们将深入探讨Java中的浅克隆(shallow clone)和深克隆(deep clone),并结合测试代码进行分析。 首先,让我们理解`Cloneable`接口。在Java中,如果一个类想要支持`clone()`方法,它必须实现`...

    中文语音克隆内含数据集和预训练模型:voice clone.zip

    除了模型和数据集,语音克隆还涉及到几个重要的技术挑战。首先是声音质量的保持,确保克隆的语音听起来自然且无明显人工痕迹。其次是隐私问题,因为语音数据包含个人的生物特征,所以在使用和存储时需要严格遵守隐私...

    在Unity3D中实现克隆脚本2

    首先,Unity3D提供了两种主要的克隆方式:`Instantiate`函数和克隆实例化。`Instantiate`是Unity内置的函数,可以用于创建对象的副本。在提供的部分内容中,我们可以看到一个使用`Instantiate`的例子,克隆了一个名...

    JAVA浅克隆与深克隆

    克隆分为两种主要类型:浅克隆(Shallow Clone)和深克隆(Deep Clone)。这篇博客文章将探讨这两种克隆方式以及如何在Java中实现它们。 首先,我们来理解一下浅克隆。浅克隆是通过调用对象的`clone()`方法创建一个...

    java 深克隆浅克隆

    Java提供了两种主要的克隆方式:深克隆和浅克隆。 1. 浅克隆(Shallow Clone): 浅克隆是通过调用对象的`clone()`方法来实现的,这个方法是Object类提供的。当一个对象被浅克隆时,新创建的对象将拥有原始对象的...

    对象克隆(clone)详解.docx

    在Java中,克隆主要涉及到`Object`类中的`clone()`方法,以及两种不同的克隆类型:浅克隆和深克隆。 一、克隆的原理与应用 `clone()`方法的工作原理是在堆上创建一个新的对象,这个新对象的内存分配与源对象相同,...

    浅析Java中clone()方法浅克隆与深度克隆

    在Java中,克隆分为两种类型:浅克隆(Shallow Clone)和深度克隆(Deep Clone)。 1. 浅克隆(Shallow Clone) 浅克隆是Java克隆机制的默认行为。当一个对象被克隆时,如果它的成员变量是基本类型(如int、double...

    Java对象的深克隆与浅克隆详解.zip(wcb2003)

    Java提供了两种主要的克隆方式:浅克隆(Shallow Clone)和深克隆(Deep Clone)。下面我们将深入探讨这两种克隆方法。 ### 浅克隆 浅克隆是指创建一个新的对象,其成员变量的值与原对象相同,但引用类型成员变量...

    Clone详解.doc

    Java中的克隆(Clone)机制是一种创建对象副本的方法,它允许程序员复制一个对象的状态,而不会影响原始对象。克隆在编程中常用于创建对象的独立副本,使得新副本与原对象之间相互独立,对其中一个对象的修改不会...

    系统克隆Spb Clone1[1].59似Spb Backup的克隆软件,可以将克隆镜像文件直接用在其他设备上进行恢复

    系统克隆Spb Clone1[1].59似Spb Backup的克隆软件,可以将克隆镜像文件直接用在其他设备上进行恢复系统克隆Spb Clone1[1].59似Spb Backup的克隆软件,可以将克隆镜像文件直接用在其他设备上进行恢复系统克隆Spb ...

    java Clone

    Java中的`clone`方法是Java语言提供的一种复制对象的方式,它允许创建一个对象的副本,这个副本与原对象具有相同的属性值,但它们是两个独立的对象,修改副本不会影响原对象。`clone`方法存在于Java的`java.lang....

    clone()方法示例(对象克隆)_对象克隆_nervouse78_源码

    总的来说,`clone()`方法是Java中一种快速创建对象副本的手段,但它需要开发者对浅拷贝和深拷贝有清晰的理解,并根据实际需求适当地处理对象的属性。通过`nervouse78`的示例,你可以学习到如何在实际项目中运用`...

    windows git 批量 clone 脚本

    在Windows环境中,Git批量操作是开发团队协作中的一项重要任务,尤其当管理多个Git仓库时。本文将深入探讨如何利用批处理脚本来实现这一目标,主要关注标题提及的"windows git 批量 clone 脚本"。我们将讨论每个文件...

Global site tag (gtag.js) - Google Analytics