1. 主页
  2. 文档
  3. 学习君土脚本
  4. 创建君土脚本代码块
  5. 在代码中做决定 – 条件语句

在代码中做决定 – 条件语句

在任何的编程语言中,代码需要依靠不同的输入作出决定并且采取行动。例如,在游戏中,如果玩家的生命值变成了0,那么游戏就结束了。在天气应用中,如果在早晨运行,就显示一张日出的图片;如果在晚上,就显示星星和月亮的图片。在这篇文章中,我们将探索在君土脚本中所谓的条件语句是怎样工作的。

只需一个条件你就可以拥有……!

人类(以及其他的动物)无时无刻不在做决定,这些决定都影响着他们的生活,从小事(“我吃面条还是吃米饭”)到治国平天下的大事(“贤人君子,明于盛衰之道,通乎成败之数,审乎治乱之势,达乎去就之理。故潜居抱道,以待其时。若时至而行,则能极人臣之位;得机而动,则能成绝代之功;如其不遇,没身而已。是以其道足高,而名重于后代。”)。

条件语句结构允许我们来描述在君土脚本中这样的选择,从不得不作出的选择(例如:“面条还是米饭”)到产生的结果。

若 … 别 语句

让我们看看, 到目前为止你将会在君土脚本中用到的最常见的条件语句类型 — 若/*if*/别/*else*/语句。

基本的的 若…别 语法

基本的语法看起来像下面的 伪代码 (一种算法描述语言):

 (条件) {
  如果条件为真,运行这里的代码
}  {
  别的情况下,运行这里的代码
}

在这里我们有:

  1. 关键字 ,并且后面跟随括号。
  2. 要测试的条件,放到括号里(通常是“这个值大于另一个值吗”或者“这个值存在吗”)。这个条件会使用比较运算符(我们会在最后的模块中讨论)进行比较,并且返回或者
  3. 一组花括号,在里面我们有一些代码——可以是任何我们喜欢的代码,并且只会在条件语句返回的时候运行。
  4. 关键字
  5. 另一组花括号,在里面我们有一些代码——可以是任何我们喜欢的代码,并且当条件语句返回值不是的话,它才会运行。

这段代码真的非常易懂——它说“如果(若)条件(条件)返回,运行代码甲,否则(运行代码乙”

注意:你不一定需要和第二个花括号——下面的代码也是符合语法规则的:

 (条件) {
  如果条件为真,运行这里的代码
}

运行其它代码

不过,这里你需要注意——在这种情况下,第二段代码不被条件语句控制,所以它总会运行,不管条件返回的是还是。这不一定是一件坏事,但这可能不是你想要的——你经常只想要运行这一段代码或者另一段代码,而不是两个都运行。

最后,有时候你可能会看到 若…别 语句没有写花括号,像下面的风格:

若 (条件) 如果条件为真,运行这里的代码
别 别的情况下,运行这里的代码

这是完全有效的代码,但不建议这样使用——因为如果有花括号进行代码切割的话,整体代码会被切割为多行代码,更易读和易用。

一个例子

为了更好的理解这种语法,让我们考虑一个例子。“天下事有难易乎?为之,则难者亦易矣;不为,则易者亦难矣。人之为学有难易乎?学之,则难者亦易矣;不学,则易者亦难矣。”在君土脚本中,我们可以这样表示:

  定 努力 = 假;
  定 事情容易做成 = 假;

  若 (努力) {
    事情容易做成 = 真;
  } 别 {
    事情容易做成 = 假;
  }

这段代码显示的结果是变量 努力 总是返回 , 意味着事情不容易做成。如果我们想让 事情容易做成的话,就需要把努力变成真。

别 若

最后一个例子提供给我们两个选择或结果,但是如果我们想要两个以上呢?

有一种方法来让你的 若…别连接你的额外的选择和结果——使用别 若 。每一个额外的选择要求放到 若() { ... } 和 别 { ... } 里——看看下面更多涉及到的例子,它们属于一个普通的天气预报的应用的一部分。

  务 获取天气信息(天气: 文): 文 {
    若 (天气 === '晴') {
      回 '今天外面阳光明媚。穿短裤!去河边或公园,吃个冰淇淋。';
    } 别 若 (天气 === '小雨') {
      回 '外面在下雨;带上雨衣和雨伞,别在外面呆太久。';
    } 别 若 (天气 === '小雪') {
      回 '雪下了——冻僵了!最好待在家里喝杯热茶,或者去堆个雪人。';
    } 别 若 (天气 === '阴') {
      回 '没有下雨,但天空是灰暗的;它随时可能变,所以带上雨衣以防万一。';
    } 别 {
      回 天气;
    }
  }
  1. 当函数运行时,我们用条件判断语句根据 天气 的值选择性的返回展示文本。注意 别 若() {...}段中的条件是怎么被判断的,除了第一个,它是在 若() {...}中被判断的。
  2. 最后一个 别 {...} 中的选择通常被叫做 “最后招数”  — 在所有的条件都不为 时其中的代码会被执行。在这个例子中,如果天气不是以上四种情况,则直接返回天气名称。

关于比较运算符

比较运算符是用来判断条件语句中的条件的。我们先回过头来看看君土脚本中的基础数学 — 数字和操作符 文章中的比较运算符。我们有如下选择:

  • === 和 !== — 判断一个值是否严格等于,或不等于另一个。
  • < 和 > — 判断一个值是否小于,或大于另一个。
  • <= 和 >= — 判断一个值是否小于或等于,或者大于或等于另一个。

注意: 如果你想复习这些内容,可以回顾之前链接上的材料。

我们想特别提到测试布尔值(真 / 假),和一个通用模式,你会频繁遇到它,任何不是 假/*false*/,灭/*undefined*/, 空/*null*/, 0, 非数/*NaN*/ 的值,或一个空字符串(”)在作为条件语句进行测试时, 实际返回真/*true*/,因此您可以简单地使用变量名称来测试它是否为真,甚至是否存在(即它不是未定义的)。例如: 

定 茶 = '花茶';

若 (茶) {
  控制台.日志('太好了,今天喝茶吧!');
} 别 {
  控制台.日志('今天没有茶。');
}

嵌套 若 … 别

将另一个若 ... 别 语句放在另一个中(嵌套)它是完全可行的。例如,我们可以更新我们的天气预报应用程序,以显示更多的选择,具体取决于温度:

    若 (天气 === '晴') {
      若 (气温 < 32) {
        控制台.日志('外面气温' + 气温 + ' 度 —— 今天外面阳光明媚。穿短裤!去河边或公园,打太极拳。');
      } 别 若 (气温 >= 32) {
        控制台.日志('外面气温' + 气温 + ' 度 —— 太热了!如果你要外出,请注意防晒!');
      }
    } 别 {
      控制台.日志('其它天气情况');
    }

即使代码全部一起工作,每个语句完全独立于另一个。

逻辑运算符:&&  , || 和 !

如果要测试多个条件,而不需要编写嵌套语句,逻辑运算符可以帮助您。当在条件下使用时,前两个执行以下操作:

  • && — 逻辑与; 使得并列两个或者更多的表达式成为可能,只有当这些表达式每一个都返回时,整个表达式才会返回真.
  • || — 逻辑或; 当两个或者更多表达式当中的任何一个返回 真 则整个表达式将会返回.

举一个逻辑 && 的例子, 刚才的那段代码片段可以写成下面这样:

    若 (天气 === '晴' && 气温 < 32) {
      控制台.日志('外面气温' + 气温 + ' 度 —— 今天外面阳光明媚。穿短裤!去河边或公园,打太极拳。');
    } 别 若 (天气 === '晴' && 气温 >= 32) {
      控制台.日志('外面气温' + 气温 + ' 度 —— 太热了!如果你要外出,请注意防晒!');
    } 别 {
      控制台.日志('其它天气情况');
    }

所以,只有当天气 === '晴'并且气温 < 32都返回时,第一个代码块才能运行。

让我们快速看一个 || 的例子:

  若 (时至而行 || 得机而动) {
    控制台.日志('极人臣之位,或成绝代之功。');
  } 别 {
    控制台.日志('没身而已。');
  }

最后一种类型的逻辑运算符,  逻辑非!  运算符表示, 可以用于对一个表达式取否. 让我们把  非运算符 结合上一个例子里的  或表达式 看看:

  若 (!(时至而行 || 得机而动)) {
    控制台.日志('没身而已。');
  } 别 {
    控制台.日志('极人臣之位,或成绝代之功。');
  }

在这一段代码中,如果逻辑或所在的语句返回 ,则非运算符会将其取否,于是整个表达式的返回值将会是

您可以在任何结构中随意合并很多个逻辑表达式。接下来的例子将会只在两边的或运算符语句同时返回时才会执行代码,这也就意味着整个与运算符语句将会返回

若 ((甲 === 5 || 乙 > 3 || 丙 <= 10) && (已登录 || 用户名 === '张三')) {
  // 运行着里的代码
}

在条件语句中运用或逻辑运算符最常见的错误是尝试声明变量后,仅检查该变量一次的情况下赋予很多个都会返回的值,不同的值之间用 || (或)运算符分隔。比如:

若 (甲 === 5 || 7 || 10 || 20) {
  // 运行这里的代码
}

在这个例子里 若(...) 里的条件总为真,因为 7 (或者其它非零的数) 的值总是为真. 这个条件实际意思是 “如果等于5, 或者7为真 — 它总是成立的”. 这不是我们想要的逻辑,为了 让它正常工作你必须指定每个或表达式两边都是完整的检查:

若 (甲 === 5 || 甲 === 7 || 甲 === 10 || 甲 === 20) {
  // 运行这里的代码
}

支语句

若...别 语句能够很好地实现条件代码,但是它们不是没有缺点。 它们主要适用于您只有几个选择的情况,每个都需要相当数量的代码来运行,和/或 的条件很复杂的情况(例如多个逻辑运算符)。 对于只想将变量设置一系列为特定值的选项或根据条件打印特定语句的情况,语法可能会很麻烦,特别是如果您有大量选择。

支/*switch*/ 语句在这里是您的朋友 – 他们以单个表达式/值作为输入,然后查看多个选项,直到找到与该值相匹配的选项,执行与之相关的代码。 这里有一些伪代码,可以给你一点灵感:

支 (表达式) {
  当 选择1:
    运行这里的代码
    断;

  当 选择2:
    运行这里的代码
    断;

  // 可以包含更多需要的选择

  默:
    条件都不满足,运行这里的代码
}

这里我们得到:

  1. 关键字 , 后跟一组括号.
  2. 括号内的表达式或值.
  3. 关键字 , 后跟一个选项的表达式/值,后面跟一个冒号.
  4. 如果选择与表达式匹配,则运行一些代码.
  5. 一个  语句, 分号结尾. 如果先前的选择与表达式/值匹配,则程序在此停止执行代码块,并执行 语句之后的代码.
  6. 你可以添加任意的 当 选项.
  7. 关键字 , 后面跟随和  完全相同的代码模式, 除了  之后不需要再有选项, 并且您不需要  语句, 因为之后没有任何运行代码. 如果之前没有选项匹配,则运行选项.

注意 部分不是必须的 – 如果表达式不可能存在未知值,则可以安全地省略它。 如果有机会,您需要包括它来处理未知的情况。

支 语句示例

我们来看一个真实的例子 – 我们将重写天气预报应用程序,以改用语句:

  务 获取天气信息(天气: 文): 文 {
    定 回文: 文;
    支 (天气) {
      当 '晴':
        回文 = '今天外面阳光明媚。穿短裤!去河边或公园,打太极拳。';
        断;
      当 '小雨':
        回文 = '外面在下雨;带上雨衣和雨伞,别在外面呆太久。';
        断;
      当 '小雪':
        回文 = '雪下了——冻僵了!最好待在家里喝杯热茶,或者去堆个雪人。';
        断;
      当 '阴':
        回文 = '没有下雨,但天空是灰暗的;它随时可能变,所以带上雨衣以防万一。';
        断;
      默:
        回文 = 天气;
    }

    回 回文;
  }

三元运算符

在我们举一些例子之前,我们要介绍一下最后一句语法。三元或条件运算符是一个语法点,用于测试一个条件,如果它是,返回一个值/表达式,如果它是假,返回另一个值/表达式,它可以占用比若...别较少的代码块。如果你只有两个通过条件选择。伪代码看起来像这样:

( 条件 ) ? 运行这里的代码 : 相反运行这里的代码

所以我们来看一个简单的例子:

定 问候 = ( 是新年 ) ? '新年好,张先生' : '早上好,张先生';

在这里我们有一个变量叫做是新年– 如果它是,我们给客人一个新年快乐的消息; 如果不是,我们给他标准的每日问候。

结论

这就是现在您真正需要了解的君土脚本中的条件结构!我相信你会理解这些概念,并轻松地通过这些例子; 如果有什么不明白的,请随时阅读文章,或者联系我们寻求帮助。