这篇文章主要介绍JavaScript中的语句,包含几种循环语句和条件语句。
JavaScript中的条件语句
一、定义
条件语句: 当条件满足时,执行一段语句
二、JavaScript中的条件语句
1) if...else if ... else: 当指定条件为真,if语句会执行一段语句,如果不满足再考虑else if的条件,若是还不满足,则执行 else里的语句
const a = 2;
if (a === 0) {
console.log('a为', a);
} else if (a === 1) {
console.log('a为', a);
} else {
console.log('a为', a);
}
2) switch...case语句: 评估一个表达式,将表达式的值与case子句匹配,并执行与该情况相关联的语句。
switch (expression) {
case value1:
// 当 expression 的结果与 value1 匹配时,执行此处语句
[break;]
case value2:
// 当 expression 的结果与 value2 匹配时,执行此处语句
[break;]
...
case valueN:
// 当 expression 的结果与 valueN 匹配时,执行此处语句
[break;]
[default:
// 如果 expression 与上面的 value 值都不匹配,执行此处语句
[break;]]
}
语法解析:
a. expression: 一个用来与 case 子语句匹配的表达式。
b. case valueN: 可选,用于匹配 expression 的 case 子句。如果 expression 与给定的 valueN 相匹配(此处是===),则执行该 case 子句中的语句直到该 switch 语句结束或遇到一个 break 。
c. default: 可选,一个 default 子句;如果给定,这条子句会在 expression 的值与任一 case 语句均不匹配时执行。
d. 如果没有添加break,那么代码将会从值所匹配的case语句开始运行,然后持续执行下一个case语句而不论值是否匹配。
参考自:
MDN--switch
3) 逻辑运算符: && 和 ||
&&: 逻辑与,使得并列两个或者更多的表达式成为可能,只有当这些表达式每一个都返回true时,整个表达式才会返回true.
||: 逻辑或,当两个或者更多表达式当中的任何一个返回 true 则整个表达式将会返回 true。
let a = 0 || 1;
a && fn();
4) 三元运算符: 是 JavaScript 仅有的使用三个操作数的运算符。一个条件后面会跟一个问号(?),如果条件为 truthy,则问号后面的表达式A将会执行;表达式A后面跟着一个冒号(:),如果条件为 falsy,则冒号后面的表达式B将会执行。本运算符经常作为 if 语句的简捷形式来使用。
let a = true;
let b = a ? 1 : 0;
JavaScript中的循环语句
一、定义
循环语句: 完成一些重复性任务。
二、for循环
for循环: 用于创建一个循环,包含三个可选的表达式包围在圆括号中,并由分号隔开,后跟一个在循环中执行的语句。
for (initializer; exit-condition; final-expression) {
// code to run
}
A.语法解析:
1) for循环中,有三个项目,以分号分隔
2) 第一个项目是初始化器(initializer),通常是一个设置为数字的变量,它被递增来计算循环运行的次数,它有时也被称为计数变量
3) 第二个项目是退出条件(exit-condition),用来定义这个循环何时停止循环
4) 第三个项目是最终条件(final-expression),通常用于增加(递减)计数器变量,使其更接近退出条件值
5) 包含代码块的花括号是每次循环都会运行这个代码
参考自: MDN--循环吧代码
B.执行顺序
1) 第一次: 执行初始化器 --> 判断初始化变量是否满足退出条件,如果满足就退出循环;不然就执行代码块里的内容 --> 执行最终条件,对初始化变量进行递增或递减
2) 后续步骤: 判断初始化变量是否满足退出条件,如果满足就退出循环;不然就执行代码块里的内容 /-->/ 执行最终条件,对初始化变量进行递增或递减
注: 使用let进行变量声明时,每次都会执行初始化器这一步。
C.for循环的优化
当循环次数为变量时,可以将长度进行储存,避免每次循环都去读取一次数组的长度,不划算
for (var i = 0, len = arr.length; i < len; i++) {
// code to run
}
D.以下结果是什么?为什么?如何达到想要的结果?
const liList = document.querySelectorAll('li'); // 有三个li
for (var i = 0, len = liList.length; i < len; i++) {
liList[i].onclick = function() {
console.log(i);
}
}
结果: 控制台输出3个3
原因: 在for循环中,var声明的变量是一个全局变量,每次参与累加或递减的都是同一个变量,所以在for循环外也可以访问到该变量。JS代码是按顺序执行的,从上到下,当其执行到元素绑定事件时(liList[i].onclick
),i的值是当前循环里的值;当点击对应元素触发事件时,由于for循环已经执行完了,这时函数里的i是一个全局的i,也就是满足for循环退出条件的i,即len,也就是3。
如何做到点击元素,输出其对应的下标:
1) 利用闭包,将函数内部的变量保存在内存中
for (var i = 0, len = liList.length; i < len; i++) {
liList[i].onclick = (function(i) {
return function() {
console.log(i);
}
})(i)
}
2) 使用let定义块级作用域。在for循环中使用let声明的变量只在本轮循环中有效,所以每一次循环的i都是一个新的变量。JavaScript引擎会记住上一轮循环的值,初始化本轮的变量i时,会在上一轮的基础上进行计算。for循环设置循环变量那部分是一个父作用域,循环体内是一个单独的子作用域。(来自 http://es6.ruanyifeng.com/#do...
for (let i = 0, len = liList.length; i < len; i++) {
liList[i].onclick = function () {
console.log(i);
}
}
3) 使用const定义块级作用域。之所以不将const声明在父作用域中,是因为当一个循环执行到一定的步骤时,会将初始变量进行递增或递减,而const声明的基本数据类型是不能修改的,不然会报错。
for (var i = 0, len = liList.length; i < len; i++) {
const a = i;
liList[i].onclick = function () {
console.log(a);
}
}
三、while循环
while循环: 可以在某个条件表达式为真的前提下,循环执行指定的一段代码,直到那个表达式不为真时结束循环。
while (condition) {
statement
}
A、语法解析:
1) condition: 条件循环语句,在每次循环前被求值。如果值为真,statement就会被执行。如果求值为假,则跳出while循环执行后面的语句
2) statement: 只要条件表达式求值为真,该语句就会一直被执行。要在循环中执行多条语句,可以使用块语句({ ... })包住多条语句。
B、执行顺序
判断条件(condition)是否满足,如果不满足就退出,如果满足就执行代码(statement);然后继续进行这一流程,知道退出为止。
参考自: MDN--while
四、do...whild循环
do...whild循环: 创建一个执行指定语句的循环,直到condition值为 false。在执行statement 后检测condition,所以指定的statement至少执行一次。
do {
statement
} whild (condition);
A、语法解析:
1) statement: 执行至少一次的语句,并在每次 condition 值为真时重新执行。想执行多行语句,可使用block语句({ ... })包裹这些语句。
2) condition: 循环中每次都会计算的表达式。如果 condition 值为真,statement 会再次执行。当 condition 值为假,则跳到do...while之后的语句。
B、执行顺序
先执行代码(statement),z再判断条件(condition)是否满足,如果不满足就调出循环,如果满足就继续执行。然后继续进行这一流程,知道退出为止。
参考自: MDN--do...whild
四、for...in
for...in: 以任意顺序遍历一个对象的除Symbol以外的可枚举属性。for ... in是为遍历对象属性而构建的,不建议与数组一起使用。IE6支持。
// variable 当object为对象时,其为key;当object为数组时,其为索引
for (variable in object){
statement
}
let obj = {a: 1, b: 2};
for (let i in obj) {
console.log(i); // 对象的key: a b
}
let arr = [1, 2, 3];
for (let i in arr) {
console.log(i); // 数组的索引: 0 1 2
}
参考自: MDN--for...in
五、for...of
for...of: 在可迭代对象(包括 Array,Map,Set,String,TypedArray,arguments 对象等等)上创建一个迭代循环,调用自定义迭代钩子,并为每个不同属性的值执行语句。IE不支持,Edge12支持。
for (variable of iterable) {
//statements
}
循环控制语句:
continue: 跳过当前循环,执行下一个循环
break: 立即退出循环。
for (let i = 0; i < 3; i++) {
if (i === 1) {
continue;
}
console.log(i); // 0 2
}
for (let i = 0; i < 3; i++) {
if (i === 1) {
break;
}
console.log(i); // 0
}
以上内容如有不对,希望大家指出,谢谢。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。