循环

循环

 在讲循环的之前,先知道一下循环结构的执行步骤 

  1、声明循环变量;
  2、判断循环条件;
  3、执行循环体操作;
  4、更新循环变量;
  5、然后循环执行2-4,直到条件不成立,跳出循环。

 

  while循环

复制代码
var num = 1;//1、声明循环变量
            
while (num<=10){//2、判断循环条件;
    document.write(num+"<br />");//3、执行循环体操作;
    num++;//4、更新循环变量;
}
复制代码

  while循环()中的表达式,运算结果可以是各种类型,但是最终都会转为真假,转换规则如下。

  ①Boolean:true为真,false为假;
  ②String:空字符串为假,所有非空字符串为真;
  ③Number:0为假,一切非0数字为真;
  ④null/Undefined/NaN:全为假;
  ⑤Object:全为真。

  do-while循环

  while循环特点:先判断后执行;
  do-while循环特点:先执行再判断,即使初始条件不成立,do-while循环至少执行一次;

 

复制代码
var num = 10;
            
do{
    document.write(num+"<br />");//10 9 8 7 6 5 4 3 2 1 0
    num--;
    }while(num>=0);
            
document.write(num);//-1
复制代码

  for循环

 for循环
  1、for有三个表达式:①声明循环变量;②判断循环条件;③更新循环变量;
    三个表达式之间,用;分割,for循环三个表达式都可以省略,但是两个“;”缺一不可。
  2、for循环的执行特点:先判断再执行,与while相同
  3、for循环三个表达式都可以有多部分组成,第二部分多个判断条件用&& ||连接,第一三部分用逗号分割;

for (var num =1; num<=10; num++) {
    document.write(num+" <br />"); //1 2 3 4 5 6 7 8 9 10 
}

  for-in循环

 for-in 循环主要用于遍历对象
  for()中的格式:for(keys in zhangsan){}
  keys表示obj对象的每一个键值对的键!!所有循环中,需要使用obj[keys]来取到每一个值!!!

  for-in 循环,遍历时不仅能读取对象自身上面的成员属性,也能延续原型链遍历出对象的原型属性
  所以,可以使用hasOwnProperty判断一个属性是不是对象自身上的属性。
  obj.hasOwnProperty(keys)==true 表示这个属性是对象的成员属性,而不是原先属性

复制代码
//声明一个Peson类
function Person(){
    this.name = "张三";
    this.age = 14;
    this.func1 = function(){
        
    }
}
//实例化这个类
var zhangsan = new Person();
//使用for-in遍历这个对象
for(keys in zhangsan){
    console.log(zhangsan[keys])
}
复制代码

 

 

for-of循环 

  ES6 借鉴 C++、Java、C# 和 Python 语言,引入了for...of循环,作为遍历所有数据结构的统一的方法。

  一个数据结构只要部署了Symbol.iterator属性,就被视为具有iterator接口,就可以用for...of循环遍历它的成员。也就是说,for...of循环内部调用的是数据结构的Symbol.iterator方法。
  for...of循环可以使用的范围包括数组、Set 和 Map 结构、某些类似数组的对象(比如arguments对象、DOM NodeList 对象)、后文的 Generator 对象,以及字符串。

 

 下面是一些数据结构的遍历

①数组

 JavaScript 原有的for...in循环,只能获得对象的键名,不能直接获取键值。ES6 提供for...of循环,允许遍历获得键值。

 

复制代码
        var arr = ['a', 'b', 'c', 'd'];

        for (let a in arr) {
          console.log(a); // 0 1 2 3
        }
        
        for (let a of arr) {
          console.log(a); // a b c d
        }
复制代码

 

 上面代码表明,for...in循环读取键名,for...of循环读取键值。如果要通过for...of循环,获取数组的索引,可以借助数组实例的entries方法和keys方法

for of跟 for in区别

for...of语句在可迭代的对象上创建了一个循环(包括Array, Map, Set, 参数对象( arguments) 等等),对值的每一个独特的属性调用一个将被执行的自定义的和语句挂钩的迭代。 for (variable of object) { statement }

下面的这个例子展示了 for...of 和 for...in 两种循环语句之间的区别。与 for...in 循环遍历的结果是数组元素的下标不同的是, for...of 遍历的结果是元素的值:

let arr = [3, 5, 7];(ES6 新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。)
arr.name = "hello";
 
for (let i in arr) {
   console.log(i); 
// log "0", "1", "2", "name"
}
 
for (let i of arr) {
   console.log(i); 
// log "3", "5", "7" // 注意这里没有name

 for...in由于历史遗留问题,它遍历的实际上是对象的属性名称。一个Array数组也是一个对象,数组中的每个元素的索引被视为属性名称,所以我们可以看到使用for...in循环Array数组时,拿到的其实是每个元素的索引。

如上所示,当我们为a多手动添加一个属性name的时候,for...in循环会把name属性也包括在内,而Array的length属性却不包括在内。
for...of循环则不存在上述的问题,它只循环集合本身的元素。这就是为什么引入for...of循环。


  与其他遍历语法的比较
for...in循环有几个缺点
  ①数组的键名是数字,但是for...in循环是以字符串作为键名“0”、“1”、“2”等等。
  ②for...in循环不仅遍历数字键名,还会遍历手动添加的其他键,甚至包括原型链上的键。
  ③某些情况下,for...in循环会以任意顺序遍历键名。
  for...in循环主要是为遍历对象而设计的,不适用于遍历数组。

for...of循环
  有着同for...in一样的简洁语法,但是没有for...in那些缺点。
  不同于forEach方法,它可以与break、continue和return配合使用。
  提供了遍历所有数据结构的统一操作接口。

 

②Set 和 Map 结构
复制代码
        var engines = new Set(["Gecko", "Trident", "Webkit", "Webkit"]);
        for (var e of engines) {
          console.log(e);
        }
        // Gecko  Trident    Webkit
        
        var es6 = new Map();
        es6.set("edition", 6);
        es6.set("committee", "TC39");
        es6.set("standard", "ECMA-262");
        for (var [name, value] of es6) {
          console.log(name + ": " + value);
        }
        // edition: 6
        // committee: TC39
        // standard: ECMA-262
复制代码

 

 上面代码演示了如何遍历 Set 结构和 Map 结构。值得注意的地方有两个,首先,遍历的顺序是按照各个成员被添加进数据结构的顺序。其次,Set 结构遍历时,返回的是一个值,而 Map 结构遍历时,返回的是一个数组,该数组的两个成员分别为当前 Map 成员的键名和键值。

 

③类似数组的对象

 类似数组的对象包括好几类。下面是for...of循环用于字符串、DOM NodeList 对象、arguments对象的例子。

复制代码
        // 字符串
        var str = "hello";
        
        for (let s of str) {
          console.log(s); // h e l l o
        }
        
        // DOM NodeList对象
        let paras = document.querySelectorAll("p");
        
        for (let p of paras) {
          p.classList.add("test");
        }
        
        // arguments对象
        function printArgs() {
          for (let x of arguments) {
            console.log(x);
          }
        }
        printArgs('a', 'b');// 'a' 'b'
复制代码

switch 循环

switch(表达式) {
     case n:
        代码块
        break;
     case n:
        代码块
        break;
     default:
        默认代码块
  } 

循环控制语句

  1、break:跳出本层循环,继续执行循环后面的语句。
    如果循环有多层,则break只能跳出一层。
  2、continue:跳过本次循环剩余的代码,继续执行下一次循环。
    ①对与for循环,continue之后执行的语句,是循环变量更新语句i++;
    ②对于while、do-while循环,continue之后执行的语句,是循环条件判断;
    因此,使用这两个循环时,必须将continue放到i++之后使用,否则,continue将跳过i++进入死循环。

 

复制代码
for(var i = 1; i < 10; i++){
     
        if(i == 4){
            continue;
        }
        console.log(n);//1 2 3 5 6 7 8 9
    }

 for(var i = 1; i < 10; i++){
        if(i == 4){
            break;
        }
         console.log(i);//1 2 3
    }

内外循环

1、所谓外循环和内循环就是指的是在for语句中,
2、外循环控制的行数,即题目中要输入多少行,
3、内循环控制的是每行输出的是什么,
4、内循环的优先级别高于外循环,
5、先外循环做一次,在做内循环,直到内循环不成立在做外循环

多if循环

  1. if(条件表达式1){
  2.        条件1为真的时候做的事情
  3. }else if(条件表达式2){
  4.        条件1不满足,条件2满足的时候做的事情
  5. }else if(条件表达式3){
  6.        条件1、2不满足,条件3满足的时候做的事情
  7. }else{
  8.        全都不满足的时候做的事情

}

跳楼现象,揭示多分支if语句的本质,就是下一个楼层已经暗含之上的楼层都不满足。

函数内的 if() 判断,跟if()同一行的,if()后面的语句 是跟if()结果绑定的

遍历数组两种方法

​第一种方法每++一次要去获取一次数组的length,不效率。二第二种方法直接赋值了,不用每次获取。

函数中的+=几 就是每次自加几  比如 i++等于i+=1   i+=2 等于每次自加2

document.getElementById("div1").getElementsByTagName("li")   获取id为“div1”里面的所有标签“li” ,只用写一个document  

 join()将数组各个元素通过指定分隔符连接成一个字符串。返回的字符串,而且数组本身不会改变

 

循环中break 和continue的区别

break用于完全结束一个循环,跳出循环体执行循环后面的语句;而continue是跳过当次循环中剩下的语句,执行下一次循环。简单点说就是break完全结束循环,continue终止本次循环。

下面举个小例子:

var str = "hello";

for (var item of str){

if(item ==="l"){

break

}

console.log(item);   

}

上述程序打印出来的结果是h e

var str = "hello";

for (var item of str){

if(item ==="l"){

continue; 

}

console.log(item);  

}

上述程序打印出来的结果是h e o

 try 和catch // 扩展知识

当try语句中出现异常是时,会执行catch中的语句,java运行时系统会自动将catch括号中的Exception e 初始化,也就是实例化Exception类型的对象。e是此对象引用名称。然后e(引用)会自动调用Exception类中指定的方法,也就出现了e.printStackTrace();。

printStackTrace()方法的意思是:在命令行打印异常信息在程序中出错的位置及原因。(这是白话解释,比较容易理解)
try{
//代码区
}catch(Exception e){
//异常处理
}
代码区如果有错误,就会返回所写异常的处理。
posted @ 2020-05-02 17:30  Ren小白  阅读(184)  评论(0)    收藏  举报
levels of contents