这是一段JS进行深复制的代码,但是我有点无法理解图片中标注的哪一行,为什么要再次调用clone(),而且当我用浏览器进行测试的时候出现了错误。
代码来源于一篇文章:http://jerryzou.com/posts/dee...
这是一段JS进行深复制的代码,但是我有点无法理解图片中标注的哪一行,为什么要再次调用clone(),而且当我用浏览器进行测试的时候出现了错误。
代码来源于一篇文章:http://jerryzou.com/posts/dee...
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
4 回答2.4k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
因为对象是引用类型的,假设
所以,如果要深拷贝对象,不能简单的只是把
a
赋值给b
。同理,在这个例子中,假设
a = {children: {name: "hello"}}
,a
的children
属性是一个对象,如果你直接使用obj[attr] = this[attr]
,那复制后的对象和a
对象的children
属性引用的是同一个对象,所以就需要对属性继续进行clone
;报错的原因:
首先,你代码没有抄全,下面还有一部分代码。当你没有抄全代码的时候,当
attr
等于"test"
的时候,this[attr].clone()
就会调用,在这次调用时,this
是String
对象"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();
...
所以会出现超过最大调用栈的情况。
原文下面是有一个
String
的clone
方法的:加上以后,就不会有这种情况了。