JavaScript 语句和函数

1. JavaScript 语句

1)if语句

javascript 复制代码
if (condition) statement1 else statement2

这里的条件(condition)可以是任何表达式,并且求值结果不一定是布尔值。

ECMAScript会自动调用Boolean()函数将这个表达式的值转换为布尔值。

如果条件求值为true,则执行语句statement1;如果条件求值为false,则执行语句statement2。

这里的语句可能是一行代码,也可能是一个代码块(即包含在一对花括号中的多行代码)。

连续使用多个if语句:

javascript 复制代码
if (condition1) statement1 else if (condition2) statement2 else statement3

2)do-while语句

do-while语句是一种后测试循环语句,即循环体中的代码执行后才会对退出条件进行求值。

换句话说,循环体内的代码至少执行一次。

do-while的语法如下:

javascript 复制代码
do {
  statement
} while (expression);

注意 后测试循环经常用于这种情形:循环体内代码在退出前至少要执行一次。

3)while语句

while语句是一种先测试循环语句,即先检测退出条件,再执行循环体内的代码。

因此,while循环体内的代码有可能不会执行。

javascript 复制代码
while(expression) statement

4)for语句

for语句也是先测试语句,只不过增加了进入循环之前的初始化代码,以及循环执行后要执行的表达式。

javascript 复制代码
for (initialization; expression; post-loop-expression) statement

无法通过while循环实现的逻辑,同样也无法使用for循环实现。因此for循环只是将循环相关的代码封装在了一起而已。

在for循环的初始化代码中,其实是可以不使用变量声明关键字的。不过,初始化定义的迭代器变量在循环执行完成后几乎不可能再用到了。因此,最清晰的写法是使用let声明迭代器变量,这样就可以将这个变量的作用域限定在循环中。

初始化、条件表达式和循环后表达式都不是必需的。因此,下面这种写法可以创建一个无穷循环:

javascript 复制代码
for (; ; ) { // 无穷循环
  doSomething();
}

如果只包含条件表达式,那么for循环实际上就变成了while循环:

javascript 复制代码
let count = 10;
let i = 0;
for (; i < count; ) {
  console.log(i);
  i++;
}

5)for-in语句

for-in语句是一种严格的迭代语句,用于枚举对象中的非符号键属性,语法如下:

javascript 复制代码
for (property in expression) statement

ECMAScript中对象的属性是无序的,因此for-in语句不能保证返回对象属性的顺序。换句话说,所有可枚举的属性都会返回一次,但返回的顺序可能会因浏览器而异。

如果for-in循环要迭代的变量是null或undefined,则不执行循环体。

6)for-of语句

for-of语句是一种严格的迭代语句,用于遍历可迭代对象的元素,语法如下:

javascript 复制代码
for (property of expression) statement

for-of循环会按照可迭代对象的next()方法产生值的顺序迭代元素。

如果尝试迭代的变量不支持迭代,则for-of语句会抛出错误。

7)标签语句

标签语句用于给语句加标签,语法如下:

javascript 复制代码
label: statement

下面是一个例子:

javascript 复制代码
start: for (let i = 0; i < count; i++) {
  console.log(i);
}

在这个例子中,start是一个标签,可以在后面通过break或continue语句引用。标签语句的典型应用场景是嵌套循环。

8)break和continue语句

break和continue语句为执行循环代码提供了更严格的控制手段。其中,break语句用于立即退出循环,强制执行循环后的下一条语句。而continue语句也用于立即退出循环,但会再次从循环顶部开始执行。

break和continue都可以与标签语句一起使用,返回代码中特定的位置。这通常是在嵌套循环中,如下面的例子所示:

javascript 复制代码
let num = 0;
outermost:
for (let i = 0; i < 10; i++) {
  for (let j = 0; j < 10; j++) {
    if (i == 5 && j == 5) {
      break outermost;
    }
    num++;
  }
}
console.log(num); // 55

9)with语句

with语句的用途是将代码作用域设置为特定的对象,其语法是:

javascript 复制代码
with (expression) statement;

使用with语句的主要场景是针对一个对象反复操作,这时候将代码作用域设置为该对象能提供便利,如下面的例子所示:

javascript 复制代码
let qs = location.search.substring(1);
let hostName = location.hostname;
let url = location.href;

上面代码中的每一行都用到了location对象。如果使用with语句,就可以少写一些代码:

javascript 复制代码
with(location) {
  let qs = search.substring(1);
  let hostName = hostname;
  let url = href;
}

这里,with语句用于连接location对象。这意味着在这个语句内部,每个变量首先会被认为是一个局部变量。如果没有找到该局部变量,则会搜索location对象,看它是否有一个同名的属性。如果有,则该变量会被求值为location对象的属性。

严格模式不允许使用with语句,否则会抛出错误。

警告 由于with语句影响性能且难于调试其中的代码,通常不推荐在产品代码中使用with语句。

10)switch语句

switch语句是与if语句紧密相关的一种流控制语句,从其他语言借鉴而来。ECMAScript中switch语句跟C语言中switch语句的语法非常相似,如下所示:

javascript 复制代码
switch (expression) {
  case value1:
    statement
    break;
  case value2:
    statement
    break;
  case value3:
    statement
    break;
  case value4:
    statement
    break;
  default:
    statement
}

这里的每个case(条件/分支)相当于:"如果表达式等于后面的值,则执行下面的语句。"

break关键字会导致代码执行跳出switch语句。如果没有break,则代码会继续匹配下一个条件。

default关键字用于在任何条件都没有满足时指定默认执行的语句(相当于else语句)。

为避免不必要的条件判断,最好给每个条件后面都加上break语句。如果确实需要连续匹配几个条件,那么推荐写个注释表明是故意忽略了break。

虽然switch语句是从其他语言借鉴过来的,但ECMAScript为它赋予了一些独有的特性。首先,switch语句可以用于所有数据类型(在很多语言中,它只能用于数值),因此可以使用字符串甚至对象。其次,条件的值不需要是常量,也可以是变量或表达式。

javascript 复制代码
switch ("hello world") {
  case "hello" + " world":
    console.log("Greeting was found.");
    break;
  case "goodbye":
    console.log("Closing was found.");
    break;
  default:
    console.log("Unexpected message was found.");
}

注意 switch语句在比较每个条件的值时会使用全等操作符,因此不会强制转换数据类型(比如,字符串"10"不等于数值10)。

2. JavaScript 函数

以下是函数的基本语法:

javascript 复制代码
function functionName(arg0, arg1, ..., argN) {
  statements
}

可以通过函数名来调用函数,要传给函数的参数放在括号里(如果有多个参数,则用逗号隔开)。

ECMAScript中的函数不需要指定是否返回值。任何函数在任何时间都可以使用return语句来返回函数的值,用法是后跟要返回的值。

要注意的是,只要碰到return语句,函数就会立即停止执行并退出。因此,return语句后面的代码不会被执行。

return语句也可以不带返回值。这时候,函数会立即停止执行并返回undefined。这种用法最常用于提前终止函数执行,并不是为了返回值。

注意 最佳实践是函数要么返回值,要么不返回值。只在某个条件下返回值的函数会带来麻烦,尤其是调试时。

严格模式对函数也有一些限制:

  • 函数不能以eval或arguments作为名称;
  • 函数的参数不能叫eval或arguments;
  • 两个命名参数不能拥有同一个名称。

如果违反上述规则,则会导致语法错误,代码也不会执行。

相关推荐
wearegogog1231 天前
基于 MATLAB 的卡尔曼滤波器实现,用于消除噪声并估算信号
前端·算法·matlab
molaifeng1 天前
Go 语言如何实现高性能网络 I/O:Netpoller 模型揭秘
开发语言·网络·golang
Drawing stars1 天前
JAVA后端 前端 大模型应用 学习路线
java·前端·学习
崇山峻岭之间1 天前
Matlab学习记录33
开发语言·学习·matlab
品克缤1 天前
Element UI MessageBox 增加第三个按钮(DOM Hack 方案)
前端·javascript·vue.js
Evand J1 天前
【2026课题推荐】DOA定位——MUSIC算法进行多传感器协同目标定位。附MATLAB例程运行结果
开发语言·算法·matlab
小二·1 天前
Python Web 开发进阶实战:性能压测与调优 —— Locust + Prometheus + Grafana 构建高并发可观测系统
前端·python·prometheus
小沐°1 天前
vue-设置不同环境的打包和运行
前端·javascript·vue.js
jllllyuz1 天前
基于MATLAB的二维波场模拟程序(含PML边界条件)
开发语言·matlab
忆锦紫1 天前
图像增强算法:Gamma映射算法及MATLAB实现
开发语言·算法·matlab