判断选择
if 判断
判断条件,只要有条件成立,if里面的代码中其他的else if都不会执行。
//单分支if(1<2){console.log(1);}//多分支if(1>2){console.log(1);}else{console.log(2);}if(1>2){console.log(1);}else if(3>2){console.log(2);}
switch-case 选择
选择一个分支开始执行,直到遇到break 后跳出整个swith选择(如case 2:,后面没有break,会继续执行到console.log(3);)。
如果没有相等的条件,就会执行defalt,这个是可选的,也可以没有。(推荐)
switch(1){case 1:console.log(1);break;case 2:console.log(2);case 3:console.log(3);break;default:console.log(4);}
switch 语句可以用于所有数据类型(在很多语言中,它只能用于数值),因此可以使用字符串甚至对象。
其次,条件的值不需要是常量,也可以是变量或表达式。
switch 语句在比较每个条件的值时会使用全等操作符,因此不会强制转换数据类型(比如,字符串”10”不等于数值 10)。
switch ("hello world") {case "hello" + " world":console.log("Greeting was found.");break;case "goodbye":console.log("Closing was found.");break;case num > 10 && num <= 20:break;default:console.log("Unexpected message was found.");}
==================
循环
while
判断条件,条件为真,就执行,然后循环,直到条件不成立,或者遇到break后停止循环
var n = 1;while(n<10){console.log(n);n++;}
do while
先执行一次代码,然后:
判断条件,条件为真,就执行,然后循环,直到条件不成立,或者遇到break后停止循环
var n = 1;do{console.log(n);n++;}while(n<10)
for
判断条件,条件为真,就执行,然后循环,直到条件不成立,或者遇到break后停止循环;
可以同时初始化多个值。
for(n=1 ; n<10 ; n++){console.log(n);}
for in
遍历数组或对象的下标
数组是把下标当做属性遍历
//数组var arr = [1,2,3,4,5,6];for(x in arr){console.log(arr[x]); //1 2 3 4 5 6}//对象var person={fname:"John",lname:"Doe",age:25};for (x in person) //x是属性名{txt = txt + ' ' + x; //txt = 'fname lname age' 属性名txt1=txt1 + ' ' + person[x]; //txt1 = 'John Doe 25' 属性值}//可以过滤掉继承的属性var o = {name: 'Jack',age: 20,city: 'Beijing'};for (var key in o) {if (o.hasOwnProperty(key)) { //对象的属性是无序的,因此 for-in 语句不能保证返回对象属性的顺序。console.log(key); // 'name', 'age', 'city'}}
如果 for-in 循环要迭代的变量是 null 或 undefined,则不执行循环体。
for of(ES6)
遍历数组值
var a = ['A', 'B', 'C'];var s = new Set(['A', 'B', 'C']);var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);for (var x of a) { // 遍历Arrayconsole.log(x);}for (var x of s) { // 遍历Setconsole.log(x);}for (var x of m) { // 遍历Mapconsole.log(x[0] + '=' + x[1]);}
遍历对象
for(let [key, value] of Object.entries(objece)){}
==================
标签
标签语句用于给语句加标签,语法如下:
label: statement
下面是一个例子:
start: for (let i = 0; i < count; i++) {console.log(i);}
在这个例子中,start 是一个标签,可以在后面通过 break 或 continue 语句引用。标签语句的
典型应用场景是嵌套循环。
==================
中断
continue 和 break
continue:跳出本次循环,立刻进行下一次循环
break:跳出当前循环体,执行循环体以外的代码
还可以给代码块加标签,然后continue 或 break 某个标签,如
cars=["BMW","Volvo","Saab","Ford"];list: //这个就是标签,就是给代码块一个名字{document.write(cars[0] + "<br>");document.write(cars[1] + "<br>");document.write(cars[2] + "<br>");break list;document.write(cars[3] + "<br>");document.write(cars[4] + "<br>");document.write(cars[5] + "<br>");}
断点调试
1、浏览器断点
点上断点,刷新,那么代码运行到断点处就会停止,右边就可以查看到一些信息
2、debugger 代码断点
代码中加入debugger,那么程序运行到debugger位置就会停止
Watch 查看变量、函数
Watch可以添加要查看的变量、函数,可以显示它们的变化
继续调试

继续连续执行代码,到下一个断点停止
单步跳过,运行当前暂停的那行代码,然后到下一行停止。进入循环体时,会一步一步循环。
进入到函数里面单步运行
var sum = function(x){for(i of arguments){console.log(i);}}debugger;sum(1,2,3,4,5)
如上例子,浏览器会在debugger这里第7行停止运行:
1、点击
,程序会跳到第8行停止运行,再点一次就会直接得到sum(1,2,3,4,5)的结果
2、如果是点击
,则程序会跳到第8行停止运行,再点一次会跳到第2行停止运行,再点就会跳到第3行,开始一步一步for循环,而不是直接得出结果。
Call Stack 查看调用栈

可以查到到函数怎么调用栈空间。如上图,sum1先入栈,最后出,sum3最后入栈,最先出。
