javascript - 关于JS深复制的一段代码,有点无法理解

查看:86
本文介绍了javascript - 关于JS深复制的一段代码,有点无法理解的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

这是一段JS进行深复制的代码,但是我有点无法理解图片中标注的哪一行,为什么要再次调用clone(),而且当我用浏览器进行测试的时候出现了错误。

代码来源于一篇文章:http://jerryzou.com/posts/dee...

解决方案

因为对象是引用类型的,假设

a = {name: "hello"};
b = a; // 这个时候b和a引用的是同一个对象
b.name = "hi"; // 此时b和a的name都是"hi"

所以,如果要深拷贝对象,不能简单的只是把a赋值给b
同理,在这个例子中,假设a = {children: {name: "hello"}}achildren属性是一个对象,如果你直接使用obj[attr] = this[attr],那复制后的对象和a对象的children属性引用的是同一个对象,所以就需要对属性继续进行clone

报错的原因:
首先,你代码没有抄全,下面还有一部分代码。当你没有抄全代码的时候,当attr等于"test"的时候,this[attr].clone()就会调用,在这次调用时,thisString对象"test""test"自有的属性是"0", "1", "2", "3",其实就是字符串的索引下标,因为我们可以通过[n]这种形式访问字符串的第(n+1)个字符。所以在for循环中会调用this[0].clone(), this[1].clone(), this[2].clone(), this[3].clone()

调用this[0].clone()的时候,"test"的第一个字符是"t",所以this"t"的字符串对象,t自有属性是"0",因为"t"的长度是1,所以会调用this[0].clone();

调用this[0].clone()的时候,"t"的第一个字符是"t",所以this"t"的字符串对象,t自有属性是"0",所以会调用this[0].clone();
...
所以会出现超过最大调用栈的情况。

原文下面是有一个Stringclone方法的:

String.prototype.clone = function() { return this.valueOf(); };

加上以后,就不会有这种情况了。

这篇关于javascript - 关于JS深复制的一段代码,有点无法理解的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆