1 回答
TA贡献1829条经验 获得超4个赞
因为对象是引用类型的,假设
a = {name: "hello"};
b = a; // 这个时候b和a引用的是同一个对象
b.name = "hi"; // 此时b和a的name都是"hi"
所以,如果要深拷贝对象,不能简单的只是把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
方法的:
String.prototype.clone = function() { return this.valueOf(); };
加上以后,就不会有这种情况了。
添加回答
举报