js无限循环为什么会错

为什么会陷入死循环。求大神
var arr = new Array;
var childarr = new Array;
arr[0] = childarr;
arr[0][0] = "ss";
arr[0][1] = "ss";
arr[0][2] = childarr;
arr[0][2][0] = "1";
function forEachData(nData){
if(isChild(nData)){
for(i=0;i<nData.length;i++){
forEachData(nData[i]);
}
}
else{
document.write(nData);
}
}
function isChild(arrsvv){
return typeof(arrsvv) == "object";
}
forEachData(arr)

代码是没有问题的。是数据的问题
arr[0] = childarr;
arr[0][0] = "ss";
arr[0][1] = "ss";
arr[0][2] = childarr;
arr[0][2][0] = "1";
这里的第4行引用了自身数据,存在了数据的无限次引用。
即结构是这样的:
[['ss','ss',['1','ss',['1','ss',['1','ss',......]]]]]
无限的引用下去。
最好把childarr克隆后在传给arr[0][2]

修改后的数据定义是这样的:
var arr = new Array;
var childarr = new Array;
arr[0] = childarr;
arr[0][0] = "ss";
arr[0][1] = "ss";
arr[0][2] = clone(childarr);
arr[0][2][0] = "1";

关于js克隆的相关实现

Object.prototype.Clone = function(){
var objClone;
if (this.constructor == Object){
objClone = new this.constructor();
}else{
objClone = new this.constructor(this.valueOf());
}
for(var key in this){
if ( objClone[key] != this[key] ){
if ( typeof(this[key]) == ‘object’ ){
objClone[key] = this[key].Clone();
}else{
objClone[key] = this[key];
}
}
}
objClone.toString = this.toString;
objClone.valueOf = this.valueOf;
return objClone;
}

不用原型方式实现,万一哪天浏览器厂商一更新可能就会有原生的Clone方法了,只写个方法

function clone(obj){
var objClone;
if (obj.constructor == Object){
objClone = new obj.constructor();
}else{
objClone = new obj.constructor(obj.valueOf());
}
for(var key in obj){
if ( objClone[key] != obj[key] ){
if ( typeof(obj[key]) == ‘object’ ){
objClone[key] = clone(obj[key]);
}else{
objClone[key] = obj[key];
}
}
}
objClone.toString = obj.toString;
objClone.valueOf = obj.valueOf;
return objClone;
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-09-29
楼主的赋值导致的死循环

==============================================
var arr = new Array;
var childarr = new Array;
arr[0] = childarr;
arr[0][0] = "ss";
arr[0][1] = "ss";
arr[0][2] = childarr; //这里导致的死循环,改成 arr[0][2] = new Array; 即可
arr[0][2][0] = "1";
===============================================
因为
arr[0] = childarr;
所以
arr[0][2] = childarr;
相当于
childarr[2] = childarr;
导致了无限赋值,所以楼主无论如何也循环不完的。追问

没用

追答

楼主,好了没。 你绝壁是直接复制代码试了吧。 我注释里很清楚啊

需要改成 arr[0][2] = new Array;

第2个回答  2012-09-28
你这不是自身调用自身,也就是俗称的递归算法
这种算法你要有个结束条件,否则会无限的运行下去,直到内存耗尽为止.追问

有解决方法吗?

追答

你先要告诉我要实现什么东西,代码没看明白

追问

就是遍历array下面的array。

如果是字符串就显示
根据数据来无限循环Array下的Array

追答

是数据初始化出了问题,它的值并不是能你预想的那样,也搞得我一头雾水,后来是通过跟踪发现的,你的只要把childarr你改成其它名称就可以了赋予正确初数据了,以下是我写的
var arr = new Array();
var arr1 = new Array("2-str1","2-str2");
var arr2 = new Array("4-str1","4-str2","4-str3");
arr[0] = "1";
arr[1]=arr1;
arr[2]= "3";
arr[3] = arr2;
//也就是说arr[1]和arr[3]要用不同的数组去赋值,否则会相互往复的引用数据,因为数组是引用类型,你对某个元素赋了某个数组,就意味着这两个对象引用了的地址是一样的,等你下次再把数组负给另一个数组元素的时候,实际上就引用了上一个元素,上一个元素本身又数组,就循环反复引用自身了。有点拗口,你用调试器跟踪一下就明白了。

追问

你的意思我明白。
但是按照你的数据
再new 一个Array
添加进 arr2里
就错了。
我需要无限级

第3个回答  2012-09-28
数组维数追问

有解决方法吗?

js无限循环为什么会错
代码是没有问题的。是数据的问题 arr[0] = childarr;arr[0][0] = "ss";arr[0][1] = "ss";arr[0][2] = childarr;arr[0][2][0] = "1";这里的第4行引用了自身数据,存在了数据的无限次引用。即结构是这样的:[['ss','ss',['1','ss',['1','ss',['1','ss',...]...

你好,我想请问一下,我的js一直在请求数据,不断刷新页面,根本停不下来...
根据你的描述,大概是你js中设置了循环。不过希望你最好把代码贴出来,然后把问题描述的精确一点。

javascript的clearTimeout问题
无限循环的原因是你取 offsetHeight的值, 而设置的是height, 所以你的 if(h>0) 总是true 其它没什么问题,

请问JS 中for 循环和while 循环的问题
两个循环括号里都是条件,语法不同而已。对while来说,它的条件是当i<5时循环执行大括号里的代码,所以必须在代码里加上i++作为条件限制,否则while将无限循环。对for来说,更是一目了然,i初始值为1,每执行一次同时执行i++,当执行至i=11时,否决条件i<11,终止循环。

js中for循环和while循环在使用的时候有何区别?
不同点:for: 对于for循环来说,一般循环的是知道指定次数的元素,比如对一个知道长度的数组或者类数组进行循环。while: 对于while循环来说,一般不知道我们需要执行多少次,不知道循环什么时候结束。当达到指定的目的后,结束循环。总结: for 和 while 都是循环方法。具体在什么情况下使用,要根据需求的...

只要提示是否停止运行此脚本,我就不能继续上网了。
这种情况一般是页面上的js程序出现死循环或者无限递归调用的BUG导致,也可能是浏览器的兼容问题。你可以换个内核不同的浏览器(Chrome、Opera、FireFox)进行访问,确认是否是浏览器的兼容问题导致。如果不是浏览器的兼容问题导致,那就说明是页面的问题了,如果清除浏览器缓存后还不能解决的话,就是页面...

js: 页面内不停的请求数据造成内存是页面很卡,怎么解决
js 怎么会不断的请求么,是Ajax请求的数据太多,还是你语法写错了造成了无限死循环!

js里while语句的问题。
while(true)while语句是根据括号内的bool值进行判断是否进行继续循环 true 就是 bool值里面的 “真”意思这个循环会无限执行下去,一般这个循环里面应该有个 break 跳出循环语句。还有问题可以追问。

新手求助:JS中do...while循环中使用 if判断语句 会导致浏览器卡死...
是的,当i===6时,continue进入下一次循环,i没办法加1,就死这了 do { i=i+1;if(i===6)} 先让i+1再判断就可以了

抓住数据的小尾巴 - JS浮点数陷阱及解法
这实际上是由于浮点数存储方式导致的精度问题。JavaScript采用IEEE 754标准的64位双精度浮点数,虽然看似精确,但实际存储时受到小数位数限制,从而产生误差。例如,0.1的二进制表示为无限循环的0.0001100110011...,转换成十进制时会有微小偏差。浮点数的存储利用科学计数法,整数部分固定为1,小数部分以...

相似回答