《红宝石》第3章“基本概念”【下】

目录

3.6 语句

3.6.1  if 语句

3.6.2  do-while 语句

3.6.3  while 语句

3.6.4  for 语句

3.6.5  for-in 语句

3.6.6  label 语句

3.6.7  break 和 continue 语句

3.6.8  with 语句

3.6.9  switch 语句

扫描二维码关注公众号,回复: 14634799 查看本文章

3.7 函数

3.7.1  理解参数

3.7.2  没有重载

3.8 小结


本章内容

  •   流控制语句
  •   函数

上一章内容 : 《红宝石》第3章“基本概念”【上】

本文链接:《红宝石》第3章“基本概念”【上】_雨季mo浅忆的博客-CSDN博客


3.6 语句

        ECMA-262 规定了一组语句 ( 也称为 流控制语句 ) 。从本质上看,语句定义了 ECMAScript 中的主要语法,语句 通常使用 一 或 多个 关键字 来完成给定任务。语句可以很简单,例如 通知 函数 退出;也可以比较复杂,例如指定 重复执行 某个 命令 的 次数。

3.6.1  if 语句

        大多数 编程语言中 最为常用的一个语句就是 if 语句。

以下是 if 语句 的 语法 :

if (condition) statement1 else statement2

    其中的 condition ( 条件 ) 可以是 任意表达式 ;而且对这个 表达式 求值 的 结果 不一定 是 布尔值 。 ECMAScript 会 自动调用 Boolean() 转换函数 将这个 表达式 的 结果 转换 为 一个 布尔值 。如果对 condition 求值的 结果 是 true ,则执行 statement1 ( 语句1 ) ,如果 对 condition 求值 的 结果 是 false ,则执行 statement2 ( 语句2 ) 。而且这两个语句既可以是一行代码,也可以是 一个 代码块 ( 以 一对 花括号 {  }  括起来 的 多行代码 ) 请看下面的例子。

if (i > 25)
  alert("Greater than 25.");           // 单行语句 
else { 
  alert("Less than or equal to 25.");  // 代码块中的语句
}

    不过,业界 普遍推崇 的 最佳实践 是 始终使用 代码块 ,即使 要执行的只有 一行代码。

因为 这样可以 消除 人们的 误解,否则可能让人分不清在不同条件下要执行哪些语句。
        另外,也可以像下面这样把整个 if 语句 写在 一行 代码中 :

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

    但我们推荐的做法则是像下面这样 :

if (i > 25) {
  alert("Greater than 25.");   
} else if (i < 0) { 
  alert("Less than 0.");
} else {
  alert("Between 0 and 25, inclusive.");
}

3.6.2  do-while 语句

        do-while 语句是一种 后测试 循环语句,即只有在 循环体中 的 代码 执行之后,才会 测试 出口 条件。换句话说,在对 条件表达式 求值 之前,循环体内 的 代码 至少会被执行 一次。以下是 do-while 语句的语法 :

do {
  statement
} while (expression);

下面是一个示例:

var i = 0; 
do {
  i += 2;
} while (i < 10);

alert(i);

    在这个例子中,只要 变量 i 的 值 小于 10 ,循环 就会一直继续下去。而且 变量 i 的 值 最初 为 0 ,每次 循环 都会 递增 2 。
        像 do-while 这种后测试循环语句最常用于循环体中的代码至少要被执行一次的情形。


3.6.3  while 语句

        while 语句 属于 前测试 循环 语句 ,也就是说,在 循环体内 的 代码 被执行之前,就会对 出口条件 求值 。因此,循环体内 的 代码 有可能永远不会被执行。以下是 while 语句的语法 :

while(expression) statement
// 下面是一个示例:
var i = 0;
while (i < 10) {
  i += 2
}

        在这个例子中,变量 i 开始时的值为 0 ,每次 循环 都会 递增 2 。而 只要 i 的 值 小于 10 ,循环 就会继续下去。


3.6.4  for 语句

        for 语句 也是一种 前测试 循环 语句 ,但它具有在执行循环之前 初始化 变量 和 定义 循环后 要执行的代码的能力。以下是 for 语句的语法 :

for (initialization; expression; post-loop-expression) statement
// 下面是一个示例:
var count =10:
for (var i = 0; i < count; i++)(
  alert(i);
}

    以上代码定义了变量 i 的 初始值 为 0 。只有当 条件表达式 ( i < count ) 返回 true 情况下才会进入 for 循环,因此也有可能不会执行 循环体中 的 代码。如果执行了 循环体中 的 代码,则一定会对 循环后的 表达式 ( i++ ) 求值,即 递增 i 的 值。这个 for 循环语句 与 下面的 while 语句 的 功能 相同 :

var count =10; 
var i = 0;
while (i < count) {
  alert(i);
  i++;
}

    使用 while 循环做不到的,使用 for 循环同样也做不到。也就是说,for 循环只是把与循环有关的代码集中在了一个位置。
        有必要指出的是,在 for 循环 的 变量 初始化 表达式中,也可以不使用 var 关键字。该变量的 初始化 可以在 外部执行,例如 :

var count = 10; 
var i;
for (i = 0; i < count; i++) {
  alert(i);
}

    以上代码与在循环初始化 表达式中 声明 变量 的 效果是一样的。由于 ECMAScript 中不存在 块级 作用域 ( 第 4 章将进一步讨论这一点 ) ,因此在 循环 内部 定义的 变量 也可以在 外部 访问到。例如 :

var count =10;
for (var i =0; i<count; i++) {
  alert(i);
}
alert(i)    // 10  

    在这个例子中,会有一个 警告框 显示 循环完成后 变量 i 的 值,这个值是 10。这是因为,即使 i 是在 循环 内部定义的一个变量,但在循环外部仍然可以访问到它。
        此外,for 语句中的 初始化 表达式、控制表达式 和 循环后 表达式 都是 可选的。将这三个表达式全部省略,就会创建一个无限循环,例如:

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

// 而只给出控制表达式实际上就把 for 循环转换成了 while 循环,例如: 
var count = 10; 
var i = 0;
for (; i < count; ) {
  alert(i); 
  i++;
}

    由于 for 语句存在极大的 灵活性 ,因此它也是 ECMAScript 中最常用的一个语句。


3.6.5  for-in 语句

        for-in 语句是一种 精准 的 迭代 语句,可以 用来 枚举 对象 的 属性

以下是 for-in 语句的语法 :

for (property in expression) statement
// 下面是一个示例:
for (var propName in window) {
  document.write(propName);
}

    在这个例子中,我们使用 for-in 循环来显示了 BOM 中 window 对象 的 所有属性。每次执行循环时,都会将 window 对象中存在的一个 属性名 赋值给 变量 propName。这个过程会一直持续到 对象中 的 所有属性 都被 枚举 一遍为止。与 for 语句类似,这里 控制语句中 的 var 操作符 也不是必需的。但是,为了保证使用 局部变量,我们推荐上面例子中的这种做法。
        ECMAScript 对象的属性没有顺序。因此,通过 for-in 循环输出的 属性名 的 顺序 是不可预测的。具体来讲,所有 属性 都会被返回一次,但返回的 先后次序 可能会因 浏览器 而异。
        但是,如果表示要 迭代 的 对象 的 变量值 为 null 或 undefined,for-in 语句会抛出错误。 ECMAScript5 更正了这一行为;对这种情况不再抛出错误,而只是 不执行 循环体。为了保证最大限度的兼容性,建议在使用 for-in 循环之前,先检测确认该对象的值是不是 null 或 undefined。

        Safari3 以前版本的 for-in 语句中存在一个 bug,该 bug 会导致某些属性被返回两次。


3.6.6  label 语句


3.6.7  break 和 continue 语句


3.6.8  with 语句


3.6.9  switch 语句


3.7 函数

        函数对任何语言来说都是一个核心的概念。通过函数可以封装任意多条语句,而且可以在任何地方、任何时候调用执行。ECMAScript 中的函数使用 function 关键字 来声明,后跟一组参数以及函数体。函数的基本语法如下所示 :

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

以下是一个函数示例 :

function sayHi(name, message) {
  alert('Hello' + name + ',' + message)
}

3.7.1  理解参数


3.7.2  没有重载


3.8 小结

        JavaScript 的核心语言特性在 ECMA-262 中是以名为 ECMAScript 的伪语言的形式来定义的。

    ECMAScript 中包含了所有基本的语法、操作符、数据类型以及完成基本的计算任务所必需的对象,但没有对取得输入和产生输出的机制作出规定。理解 ECMAScript 及其纷繁复杂的各种细节,是理解其在 Web 浏览器中的实现——JavaScript 的关键。

  目前大多数实现所遵循的都是 ECMA-262 第 3 版,但很多也已经着手开始实现第 5 版了。以下简要总结了 ECMAScript 中基本的要素。

  • 1、ECMAScript 中的基本数据类型包括 Undefined、Null、Boolean、Number 和 String 。
  • 2、与其他语言不同,ECMScript 没有为 整数 和 浮点数值 分别定义不同的数据类型,Number 类型可用于表示所有数值。
  • 3、ECMAScript 中也有一种复杂的数据类型,即 Object 类型,该类型是这门语言中所有对象的基础类型。
  • 4、严格模式为这门语言中容易出错的地方施加了限制。
  • 5、ECMAScript 提供了很多与 C 及其他类 C语言 中相同的基本操作符,包括算术操作符、布尔操作符、关系操作符、相等操作符及赋值操作符等。
  • 6、ECMAScript 从其他语言中借鉴了很多流控制语句,例如 if 语句、for 语句和 switch 语句等。 ECMAScript 中的函数与其他语言中的函数有诸多不同之处。
  • 7、无须指定函数的返回值,因为任何 ECMAScript 函数都可以在任何时候返回任何值。
  • 8、实际上,未指定返回值的函数返回的是一个特殊的 undefined 值。
  • 9、ECMAScript 中也没有函数签名的概念,因为其函数参数是以一个包含零或多个值的数组的形式传递的。
  • 10、可以向 ECMAScript 函数传递任意数量的参数,并且可以通过 arguments 对象来访问这些参数。
  • 11、由于不存在函数签名的特性,ECMAScript 函数不能重载。

上一章内容 :《红宝石》第3章“基本概念”【上】

本文链接:《红宝石》第3章“基本概念”【上】_雨季mo浅忆的博客-CSDN博客 

猜你喜欢

转载自blog.csdn.net/weixin_58099903/article/details/129711975