为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕娘9325324 2018-12-26 16:13:44
这是一段JS进行深复制的代码,但是我有点无法理解图片中标注的哪一行,为什么要再次调用clone(),而且当我用浏览器进行测试的时候出现了错误。代码来源于一篇文章:http://jerryzou.com/posts/dee...
查看完整描述

1 回答

?
浮云间

TA贡献1829条经验 获得超4个赞

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

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(); };

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


查看完整回答
反对 回复 2019-01-02
  • 1 回答
  • 0 关注
  • 480 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信