关于js的几个小问题,有关数组,循环

var index = [];
index[0] = Math.floor(Math.random()*4);
while(index.length<4){
        var num = Math.floor(Math.random()*4);
        for(var i=0; i<index.length; i++){
            if(index[i]==num){
                break;
            }
        }
        if(i==index.length){
            index[index.length] = num;
        }
 }

首先,i不是定义在for循环中吗,为什么能直接在第二个if中应用;
其次,index[0]=x的意思是数组第一个值是x吗?这时候是不是index.length为1,
那index[4]=3是不是说明数组的第5个值为3,并且自动赋予了数组5个值
最后,整个while循环有些看不懂,望解析一下(随机取0到3之间的值我还是明白的)

第一遍循环,i=0,这样index[index.length],这个就是index[1],相当于数组length=2了,再次循环,到index[index.length]时,数组长度=3了,直到length=4,退出循环

第一,var i只是在内部循环中的局部变量,无法作用于where,index[0]=x是把x的值赋给index[0]中。index.length是固定的,表示数组的长度

根据你的while条件 你的数组长度最多为3呢

这个写法没有报错吗 而且数组的长度最多为3,这种写法是为了实现什么功能,把数组的1 2 3赋值1 2 3吗,可以简单的写啊。

你的I变量只是定义在For循环中 ,你在外面引用肯定引用不了

index[0]=x就是把x赋予给你index数组的第一个值,index[index.length]=x应该走不通吧,要是想把x赋值给index数组的最后一个值得话,应该是index[index.length-1]=x;再就是i写在for循环外面,有点没读通,不是语法错误吗?

index[0]=x就是给数组的第一个元素赋值为x,i是肯定要放在for循环里面的,我们看这段代码也知道for循环里面什么都没做,符合index[i]==num这个条件就 break,怕只有陈独秀先生可以写出这样的代码

for循环不是函数,所有i的值在for循环外也能作用,比如for(var i=0; i<4; i++){},for循环外,i=4

i只是在内部循环中的局部变量,无法作用于where,index[0]=x是把x的值赋给index[0]中。index.length是固定的,表示数组的长度

js 是动态语言,弱类型,声明变量通用var可以看出,不要用常规严谨语言来等同js语法,

一本js权威指南就有1000多页,可想js看起来简单却又很不简单

楼主第一个问题:首先,i不是定义在for循环中吗,为什么能直接在第二个if中应用?

js有一个很重要的特性,变量只有函数作用域,没有块级作用域(常见for、if、while等),举个例子

var name="qingtian";  
if(true){  
    var name="xiaoxiao";  
    alert(name) ; 
}  
alert(name); 

你会发现两次alert的结果都是"xiaoxiao"
如果有块级作用域,明显if语句将创建局部变量name,并不会修改全局name,可是没有这样,所以Js没有块级作用域

再看这段代码,去掉全局变量name声明

if(true){  
    var name="xiaoxiao";  
    alert(name) ; 
}  
alert(name); 

你会发现两次alert的结果仍是"xiaoxiao",为什么最后一个alert不报name未定义?说明js变量就有函数作用域的,
这里就解答了楼主的第一个问题

楼主第二个问题:其次,index[0]=x的意思是数组第一个值是x吗?这时候是不是index.length为1,
那index[4]=3是不是说明数组的第5个值为3,并且自动赋予了数组5个值

js很随意,数组 var index = []; 这就创建好了,不想java还得声明大小

index[0]=x的意思是给index数组第一个位置赋值x,在没有声明数组大小的前提下,index.length为1

index[4]=3 的意思是给index数组的第五个位置赋值3,有没有自动赋予了数组5个值,看下这段代码

var index = [];
index[0] = 0
index[4] = 4;
alert(index[3]);
alert(index[4]);

第一个alert结果是undefined,第二alert结果是4,显然index[4] = 4再赋值同时声明了大小,为赋值的位置都是undefined

楼主第三个问题:整个while循环有些看不懂,望解析一下

Math.random():从0到1取随机数
Math.floor(x):向下取整,Math.floor(5.8)结果是5;Math.floor(-5.8)结果是-6

前两个问题及这个函数搞明白后,我觉得整段代码没啥好解析了,while循环次数取决于你的随机数的值,剩下的就是赋值及逻辑判断

你这错误有点多
1、你的if条件可能是写在for里面的;
2、index[0]=x表示index这个数组的第一个元素的值等于x;
3、index[4]=3,你的这个语句里是不会出现index[4]的,首先你的while(index.length<4)表示,只会有0、1、2、3,当然这一切的前提都是你这是数字数组哈;

第一:i定义在for循环中,所以for循环中肯定能用啊,for循环外是不能用的;
第二:是;
第三:是说明第5个数是3,但是,不会自动赋予数组5个值,只有最后一个赋值了,其他都是undefined;
第四:整个循环我觉得就是捕捉随机数(其实我也觉得有点绕脑)

第一个 js 是没有局部变量的 一旦初始化 在哪里都能访问 没有初始化是undefined 除非是object里面的属性才可以算是局部


var index = []; index[0] = Math.floor(Math.random()*4); while(index.length<4){ var num = Math.floor(Math.random()*4); for(var i=0; i<index.length; i++){ if(index[i]==num){ break; } } if(i==index.length){ alert(i + '||' + num + '||' + index.length); index[index.length] = num; } } document.write(index)



你黏贴到 html里面 运行 ,看每一步结果就明白了

Javascript的变量的scope是根据方法块来划分的(也就是说以function的一对大括号{ }来划分)。切记,是function块,而for、while、if块并不是作用域的划分标准,楼主的代码没错,楼主的代码类似于 while(true){ var j = 1; break; } alert(j) 打出来是1,【虽然j已经在while scope以外了】

前端的数据类型 都是用 var表示 你前面的循环中 i 不加var 也是对的 所以第二个i不是同一个 所以你写错了 .length长度 你只有一个 是1

一个是作用域的问题,这个为什么不报红,我也不知道,也不知道,你其他地方有没有定义,正常情况下,不定义一个变量就使用,会报错的,超出这个作用域也是会报错的;可以debugger一下子看看原因;