流程控制语句
条件语句
if 语句(else)
提示
truly
变量:!!a===true
的变量
falsy
变量:!!a===false
的变量
以下是 falsy
变量。除此之外都是 truly
变量
!!0 == false
!!NaN == false
!!'' == false
!!null == false
!!undefined == false
!!false == false
if
语句判断该变量是 truly
变量还是 falsy
变量
- 在
if
语句中,else
是可以省略的
var a = 1
if ((a = 1)) {
console.log('a=1')
}
- 如果
if
语句体中只有一行语句,可以省略大括号和换行
if ((a = 1)) console.log('a=1')
switch 语句
- 在
switch
的圆括号中一般是一个变量名,这个变量将被分类讨论 case
表示“情况”,它后面没有圆括号,直接跟一个值。程序会依次将case
后面的值与switch
圆括号中的值进行全等比对,如果比对结果为true
,则执行这条case
冒号后面的语句- 如果比较结果为
false
,则继续向下比较,如果所有的比较结果都为false
,则执行default
后的语句 - 多条
case
可以共用同一个语句体:
var Animal = 'Giraffe'
switch (Animal) {
case 'Cow':
case 'Giraffe':
case 'Dog':
case 'Pig':
console.log("This animal will go on Noah's Ark.")
break
case 'Dinosaur':
default:
console.log('This animal will not.')
}
switch
语句并不像if
语句那样当执行了某一个分支之后会自动跳出if
语句体,必须主动调用break
来跳出switch
语句体。如果不书写break
,则后面的所有case
都将被视为匹配,直到遇见break
,default
后的break
是否可以省略和它的书写位置有关,如果在最后是可以省略的:
var foo = 0
switch (foo) {
case -1:
console.log('negative 1')
break
case 0: // foo 的值为 0 所以匹配这里所以这一块会运行
console.log(0)
// 注意:那个没写的 break 原本在这儿
case 1: // 'case 0:' 里没有 break 语句所以这个 case 也会运行
console.log(1)
break // 遇到了 break,所以不会再继续进入 'case 2:' 了
case 2:
console.log(2)
break
default:
console.log('default')
// break
}
- switch 语句内的块级作用域ES6
const action = 'say_hello'
switch (action) {
case 'say_hello':
let message = 'hello'
console.log('0 ~5')
break
case 'say_hi':
let message = 'hi'
case 6:
console.log('6')
break
default:
console.log('Empty action received.')
}
这个示例会导致意想不到的错误 Uncaught SyntaxError: Identifier 'message' has already been declared
.
这是因为第一个 let message = 'hello';
与第二个 let message = 'hi';
语句产生了冲突,虽然他们处于各自分隔的 case 语句中,即 case 'say_hello':
和 case 'say_hi':
。导致这一问题的根本原因在于两个 let
语句处于同一个块级作用域,所以它们被认为是同一个变量名的重复声明。
通过把 case
语句包装到括号里面,我们就可以轻松解决这个问题:
const action = 'say_hello'
switch (action) {
case 'say_hello': {
// added brackets
let message = 'hello'
console.log(message)
break
} // added brackets
case 'say_hi': {
// added brackets
let message = 'hi'
console.log(message)
break
} // added brackets
default: {
// added brackets
console.log('Empty action received.')
} // added brackets
}
三元运算符
条件表达式?表达式 1:表达式 2
问号前面是判断的条件,问号后面用冒号隔开两个表达式。当条件表达式为真时调用表达式 1,为假时调用表达式 2。
三元运算符的用途:根据某个条件是否成立,在两个不同值中选择变量的值
var age = 18
var res = age >= 18 ? '成年人' : '未成年人'
console.log(res) // 成年人
循环语句
for
for
循环设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域
for (let i = 0; i < 3; i++) {
let i = 'abc'
console.log(i)
}
// abc
// abc
// abc
上面代码正确运行,输出了 3 次 abc
。这表明函数内部的变量 i 与循环变量 i 不在同一个作用域,有各自单独的作用域(同一个作用域不可使用 let
重复声明同一个变量)
for
循环的高级用法:label:statement
label
表示标签名statement
表示代码块label
标签名与statement
表示代码块之间使用冒号分隔
定义的标签可以在将来由 break
或 continue
语句引用
var num = 0
outernum: for (var i = 0; i < 10; i++) {
for (var j = 0; j < 10; j++) {
if (i == 5 && j == 5) {
break outernum
}
num++
}
}
alert(num) //55
在这个例子中,outernum
标签表示外部的 for
语句。如果每个循环正常执行 10 次,则 num++
语句就会正常执行 100 次。换句话说,如果两个循环都自然结束,num
的值应该是 100。但内部循环中的 break
语句带了一个参数(outernum
标签)。添加这个标签的结果将导致 break
语句不仅会退出内部的 for
语句(即使用变量j
的循环),而且也会退出外部的 for
语句(即使用变量 i
的循环)。为此,当变量 i
和 j
都等于 5 时,num
的值正好是 55。同样,continue
语句也可以像这样与 label
语句联用,如下面的例子所示:
var num = 0
outernum: for (var i = 0; i < 10; i++) {
for (var j = 0; j < 10; j++) {
if (i == 5 && j == 5) {
continue outernum
}
num++
}
}
alert(num) //95
在这种情况下,continue
语句会强制继续执行循环,即退出内部循环,执行外部循环。当 j
是 5 时,continue
语句执行,而这也就意味着内部循环少执行了 5 次,因此num
的结果是 95。
while
while
语句,是一种“不定范围”循环while
语句事先不指定循环开始、结束的范围,只要测试条件满足,就一直执行循环体while
循环没有显式定义循环变量,必须自己在while
循环外先定义好循环变量,有时甚至可以没有循环变量。
var n = 1
var result = 0
while (n <= 100) {
result += n
n++
}
console.log(result) // 输出1到100的和
break continue
- break 表示立即终止循环,它只能用在循环语句中,在
for
循环和while
循环中都可以使用
for (var i = 0; i < 10; i++) {
console.log(i)
if (i == 4) {
break
}
}
break
用在while
语句中,通常和while(true){}
搭配使用while(true){}是一个死循环,通过 break 可以让它终止循环
var n = 1
while (true) {
if (n * n > 456789) {
console.log(n)
break
}
n++
}
continue
用于跳过循环中的一个迭代,并继续执行循环中的下一个迭代
for (var i = 0; i < 5; i++) {
if (i == 3) {
continue
}
console.log(i)
}
do...while
do while
循环是一种“后测试循环语句”。它不同于for
循环和while
循环每次都是“先测试条件是否满足,然后执行循环体″,do while
循环是“先执行循环体,然后测试条件是否满足"do while
循环将循环执行条件写到了循环体的后面,这样一来,循环体一定会至少执行一次,然后再检测循环执行条件是否为true
,决定是否继续执行循环体。
var i = 11
do {
console.log(i)
i++
} while (i <= 10)
3 种循环对比
