4、JS之双重循环跳转及数组

1、什么是双重循环

双重循环就是一个循环体里面包含另外一个完整的循环,一个循环里面套着另外一个循环,即双重循环

2、双重循环语法结构

1、for的双重循环

语法:

	for(循环条件1){
		循环操作1;
		for(循环条件2){
			循环操作2
	}
		}

循环条件1的for循环我们称之为外层循环,循环条件2的循环我们称为内层循环。

特点:
外层循环运行一次,内层循环循环一轮。

2、注意:
多重循环在使用的过程中,不要超过三层,一旦超过,逻辑太复杂了,正常双重for就能满足需求

3、用for循环写九九乘法表

我们学习过,doucument.write(‘值’),页面就会显示这些内容,写到页面上。此处,我的九九乘法表就可以用这样的方式写到页面上去。

观察规律:
第一个数每行都是自增1。
我们发下第二个数都是从1开始,依次递增1,永远不大于前面的数。
前面数字每自增一次,后面数字自增一轮。

我们可以用双重for循环,外层初始值设为i,i从1开始,到9结束,自增1
内层从初始值设为j,j从1开始,小于等于外层的i,自增1

代码:

	for (var i = 1;i<=9;i++){
   		 for (var j = 1;j<=i;j++){
       	 document.write(i+'*'+j+'='+(i*j)+'&nbsp;&nbsp;&nbsp;');
    }
    document.write('<br>');//换行
	}

3、作用域

1、作用域就是可访问变量的范围,变声作用的区域。

2、作用域分为全局作用域和局部(函数)作用域

1. 全局作用域
函数以外声明的作用域叫全局作用域,整个文件都可以进行调用

代码示例:
//全局作用域

var num = 8;
alert(num);

此时可以调用,因为变量是在函数外声明的,全局整个文件都可以调用。

  1. 函数作用域
    在函数内声明的变量,只能在函数内调用。
    代码示例:
function fn() {
   	 var num = 9;
	}
	alert(num);

此时,alert不出来东西,我们看控制台的console,可以看到:‘num is not defined’,告诉我们num未被定义,这是因为,num是在函数内声明的,它的作用域只在该函数内,外边调用不了这个函数,这就是局部作用域。

1、 如果我们在函数内调用该num,然后调用该函数,是可以的。

代码示例:

function fn() {
    var num = 9;
    alert(num);
}
fn();

因为是在函数内调用的

2、 如果我们在函数外声明一个全局函数,然后在函数内进行调用:

	var num = 9;
	function fn() {
 	   alert(num);
	}
	fn();

因为,此时调用的num是全局变量,全局都可以使用,不论函数内还是函数外。

3、如果全局声明一个变量,函数内声明一个变量,变量名同名

代码示例:

	var num = 9;
	function fn() {
 	   var num = 10;
	    alert(num);
	}
	fn()
	alert(num);

此时的fn 弹出的是10,alert(num)弹出的9,因为fn调用的是函数内的变量,alert访问不了函数内,还是获取的全局变量,函数外的那个,所以弹出10,9.

4、 如果全局声明一个变量,函数内声明一个变量不加var,变量名同名

代码示例:

	var num = 9;
	function fn() {
 	   num = 10;
	    alert(num);
	}
	fn()
	alert(num);

此时,弹出的是10,10,因为函数内num没有声明var变量,访问的是全局的变量var num,函数从上往下执行,被函数内的num赋值了10,覆盖了上面的var num9.

如果上述的代码fn和alert(num)交换位置,那么弹出的是9,10.因为第一访问的全局变量还没有被覆盖。

总结:
1、不加var 当变量名重名的时候,很容易把上面同名的变量名的值给覆盖掉进行修改。
2、函数内的变量不加var的时候,执行完该函数后,会自动提升作用域,提升为全局作用域。

	function fn() {
	    num = 10;
	}
	fn();
	alert(num);

5、js执行流程及示例

js执行流程:

1、代码的检查装载阶段(预编译阶段),此阶段进行变量和函数的声明,但是不对变量进行赋值,变量的默认值为undefined。
大白话,就是将所有的声明(此时可理解为变量声明),都提升到最上面的位置,有变量名,但是没有值,就叫只声明不赋值,所以默认值是undefined。
2、代码的执行阶段,此阶段对变量进行赋值和函数的声明。
大白话:搞完步骤1以后,会对变量进行赋值。并从上向下执行。

var a=1; //声明了一个全局变量
function func(){
console.log(a); //输出:undefined。打印a,而在func这个作用域中已经声明了a变量,按照js的执行顺序,此时的a并未被赋值。
var a=1;
console.log(a); //输出:1。
}

上面代码第一个a输出undefined。
原因:js作用域链的访问规则,当前作用域内存在要访问的变量a,所以使用当前作用域中的变量(就近原则)。再根据js代码的执行顺序,此时的a只是声明了而并未被赋值,默认为undefined,所以输出undefined。

3、举例看各种效果:

var a =100;
  function fn() {
      var b = 2 * a;
      var a = 200;
      var c = a/2;
      alert(b);
      alert(c);
  }

  fn();

此时alert(b)显示NaN,因为根绝作用域访问规则,会先从当前作用域内找要访问的变量,就近原则,发现有变量a,再根据执行流程第一步,此时的a并未被赋值,所以是undefined,所以*2的时候显示NaN。
而能弹出c的100,因为从上向下执行的时候,a已经被赋值了200,所以结果为100.

6、字符串拼接

1、分析
var a =1;
alert(‘a’)和alert(a);

上面显示的结果是不同的,第一个弹出a,第二个弹出1.
因为引号内的内容是原样输出的,写什么输出什么。直接写变量名,接收的是变量值,内容和内容之间的拼接用+号连接 如:alert(‘a的值是’+a);

7、break 和continue

1、break 特点
1.break语句用于终止某个循环,使程序跳到循环块外的下一条语句
2.在循环中位于break后的语句将不再执行
3.不仅可以用在循环中,也可以用在其他语句中

2、 练习break语句:
依次输入5名学员成绩,如果成绩输入为负数,则强制停止输入,并给予提示;
否则,在页面中输出学员成绩

代码示例:

for (i=0;i<5;i++){
    var score = prompt('请输入第'+(i+1)+'名同学的成绩')-0;
    if (score<0||isNaN(score)){
        document.write('第'+(i+1)+'名同学成绩输入有误,强制退出');
        break;
    }
    document.write('第'+(i+1)+'名同学的成绩为:'+score+'<br>');

}

8、小练习大练兵

1、让用户输入一组数字,判断是几位数,
比如说,223,-----3位
比如说,1000,-----4位

代码:

var num = prompt('请输入一个数字')-0;
for (var i = 1;i > 0;i++){
    num = parseInt(num / 10);
    console.log(num);
    if (num <= 0){
        break;
    }
}
alert('这是个'+i+'位数');

2、判断1000以内的质数

分析:
什么是质数,指在大于1的自然数中,除了1和它本身以外不再被其他数整除。
所以我们可以判断,数字是从2-1000以内的数字,除数就是从1-自己本身内的数字,然后判断除了1和自身,能不能被其他数字整除,如果还有其他,肯定就是不是的

代码:
for (var i =2;i<=1000;i++){

    for (var j =2;j<=i;j++){
        if (i%j===0){
            break;
        }
    }
    if (i===j){
        document.write(i+'是质数<br>');
    }
}

9、数组

1、什么是数组:
保存一组数据的集合,就称为数组

2、数组的作用
对象的作用是:使用单独的变量名来存储一系列的值,用一个变量名来存储多个数据,就不用一个一个起变量名了

3、声明数组

var 数组名 = [];

[]就代表数组。

第二种写法:

var 数组名 =new Array();  了解即可 不需要记

** 4、给数组赋值:**

var nums = [1,2,3,4,5,6,7,8....];

数组赋值直接在中括号里面写。
一个数组内可以写无数个值,每个值用逗号隔开。

5、如何访问数组:

数组名[下标]

下标就是数组内每个值的顺序的编号,编号从0开始,0,1,2,3…
例子:
nums[2];指的就是3,因为下标是从0开始的,所以下标2就是数组内的第三个数3

6、如何查看数组的长度

数组名.length; 显示的就是数组内有几个数组项,比如数组里面装了5个数据,那么 数组名.length输出的结果就是5。

7、如何一次把数组内的元素全部都展现出来。(此处以数组nums示例)
我们直到查看数组内元素的方法是 nums[下标],如果想全部查看:

nunms[0];
nunms[1];
nunms[2];
nunms[3];
nunms[....];

我们发现这样非常的麻烦,同时间发现了一个规律,数组的下标是从0开始,每次自增1,所以,我们可以用for循环,初始值就是0,条件就是小于数组的长度,每次自增1,执行的操作就是弹出nums[i];

var nums = [1,2,3,4,5,6];
for (var i = 0; i<nums.length;i++){
    document.write(nums[i]+'<br>');
}

这种一查看数组内全部元素的方法,专业的叫法是:遍历数组。

小练习,计算数组内所有数字的和:

var nums = [1,2,3,4,5,6];
var sum = 0;
for (var i = 0; i<nums.length;i++){
    sum = sum + nums[i];
}
document.write(sum);

8、数组的方法:

1.数组名.push(值);
意思就是在数组的最后面添加一个值
2.数组名.unshift(值);
意思就是在数组的最前面添加一个值

3.数组名.splice(a,b); a代表从第几个删除,b代表删除几个

9.数组去重:

代码示例:

var arr = [1,2,3,4,5,6,1,2,3,4,5,6,1,2,3,4,5,6];
console.log(arr);
//外层循环是比较项  内层循环是被比较项
for (var i = 0; i<arr.length;i++){
    for (var j =i+1 ;j<=arr.length;j++){
        if (arr[i]==arr[j]){
            arr.splice(j,1);
            j--;
        }
    }
}
console.log(arr);
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值