当前位置: 首页 > news >正文

JavaScript 语句和函数

1. JavaScript 语句

1)if语句

if (condition) statement1 else statement2

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

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

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

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

连续使用多个if语句:

if (condition1) statement1 else if (condition2) statement2 else statement3

2)do-while语句

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

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

do-while的语法如下:

do {statement
} while (expression);

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

3)while语句

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

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

while(expression) statement

4)for语句

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

for (initialization; expression; post-loop-expression) statement

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

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

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

for (; ; ) { // 无穷循环doSomething();
}

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

let count = 10;
let i = 0;
for (; i < count; ) {console.log(i);i++;
}

5)for-in语句

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

for (property in expression) statement

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

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

6)for-of语句

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

for (property of expression) statement

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

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

7)标签语句

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

label: statement

下面是一个例子:

start: for (let i = 0; i < count; i++) {console.log(i);
}

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

8)break和continue语句

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

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

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语句的用途是将代码作用域设置为特定的对象,其语法是:

with (expression) statement;

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

let qs = location.search.substring(1);
let hostName = location.hostname;
let url = location.href;

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

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语句的语法非常相似,如下所示:

switch (expression) {case value1:statementbreak;case value2:statementbreak;case value3:statementbreak;case value4:statementbreak;default:statement
}

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

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

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

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

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

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 函数

以下是函数的基本语法:

function functionName(arg0, arg1, ..., argN) {statements
}

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

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

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

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

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

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

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

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

http://www.dtcms.com/a/310673.html

相关文章:

  • ensp防火墙安全策略实验
  • 【全网首个公开VMware vCenter 靶场环境】 Vulntarget-o 正式上线
  • Linux权限提升
  • shell编程练习,实现循环创建账户、测试主机连通性、批量修改主机root密码等功能
  • Linux 用户与组管理:从配置文件到实操命令全解析
  • Lecture 7: Processes 4, Further Scheduling
  • 嵌入式系统中常用通信协议
  • 高压大电流与低压大电流电源的设计难点
  • QT中重写事件过滤失效(返回了多个事件)
  • Jetpack Compose Column组件之focusProperties修饰符
  • 基于C#和NModbus4库实现的Modbus RTU串口通信
  • 【工具分享】模拟接口请求响应的Chrome插件ModResponse
  • 光伏运维数据透明化,发电量提高45%
  • Cursor免费使用工具
  • 配置多数据源dynamic-datasource 开箱即用方案​
  • ubuntu使用man手册中文版办法
  • 同品牌的系列广告要如何保证宣传的连贯性?
  • C语言(02)——标准库函数大全(持续更新)
  • 精品可编辑PPT | 集团整体架构与商务智能解决方案
  • Klipper-配置解析
  • 「一键召唤 007」:开源多智能体 JoyAgent-JDGenie 如何让你的 AI 产品从 Demo 到 真香 只差 Ctrl+C / Ctrl+V?
  • 电商客服协同中,智能处理哪些问题,人工专攻哪些需求?
  • 日志管理工具 ——ELK Stack
  • 开源工具FossFLOW,绘制技术图表
  • 告别软件残留!IObit Uninstaller Pro 让电脑彻底干净!
  • GPS定位 JT808 / 视频监控 - JT1078 技术剖析(1)
  • 《文明5》错误代码0xc0000142修复方法
  • JavaScript 中的 new 关键字和函数调用方法详解,apply、call 和 bind 的区别
  • 解决MySQL不能编译存储过程的问题
  • session和cookie作用详解