流程控制语句

zfh大约 6 分钟约 1767 字...

条件语句

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 表示代码块之间使用冒号分隔

定义的标签可以在将来由 breakcontinue 语句引用

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 的循环)。为此,当变量 ij 都等于 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 种循环对比

3循环对比
3循环对比
上次编辑于:
本站勉强运行 小时
本站总访问量
網站計數器