控制结构:条件分支
在 rmmz 中编写复杂事件时,必不可少的是“条件分支”。
js 中也有相当于条件分支的写法,那就是 if 语句。
条件分支(if)
if 语句是实现仅在满足条件时执行处理的最基本语法。
仅在满足小括号中指定的条件时,执行由大括号 {} 包围的部分。
语法
if (『条件式』) {
『满足条件时进行的处理』
}
示例
let aaa = 1;
if (aaa <= 1) {
console.log('ok1');
console.log('ok2');
}
小括号 () 中书写的是条件表达式。
条件表达式中需要指定比较运算符或布尔值(忘记了请复习变量的类型)。
比较运算符有以下种类。
| 比较运算符 | 含义 |
|---|---|
a === b | a 与 b 相等 |
a !== b | a 与 b 不相等 |
a >= b | a 大于等于 b |
a <= b | a 小于等于 b |
a > b | a 大于 b |
a < b | a 小于 b |
被大括号包围的部分称为“块”。
块是将多个语句汇总为一个整体的集合。
块除了 if 语句之外,今后也会在各种场合使用,请务必牢记。
顺便一提,事件命令“条件分支”中有一个“创建不满足条件时的分支”复选框。
同样的事情用 if 语句也能实现。
let aaa = 1;
if (aaa <= 1) {
console.log('ok1');
console.log('ok2');
} else {
console.log('ng1');
}
使用块进行缩进
在块内书写时,会像下面这样插入固定数量的空格或制表符,这称为缩进。
if (aaa <= 1) {
console.log('这一行进行了缩进。');
}
通过缩进可以更容易把握程序的结构。缩进通常使用一个制表符、两个半角空格、四个半角空格等。
在 rpgmaker 的事件中,条件分支和循环等也会有缩进,所以我想在感觉上也容易接受。
非严格相等运算符
在其他编程语言中,判断相等的运算符通常是 a == b。
实际上这个运算符在 js 中也存在。
但是当变量类型不同时,例如比较数值 1 和字符串 '1' 也会返回 true,这是一个非常有问题的规格。
因此,在实际开发中几乎只使用 ===(称为严格相等运算符)。即使忘掉 == 也基本没有问题。
逻辑运算符
这里将讲解更复杂的 if 语句。
在事件命令中,对于“仅在满足 A 且 B 时分支”这样的处理,我想您会使用嵌套的条件分支。
而对于“满足 A 或 B 时分支”的处理,我想您会并列书写两个条件分支。
在 js 中,可以将上述分支合并为一个。
“A 且 B”用 A && B 表示,“A 或 B”用 A || B 表示。
let a = true;
let b = false;
if (a && b) {
console.log('a为true,b为false,所以不满足条件。');
}
if (a || b) {
console.log('a为真,即使b为false也能满足条件。');
}
逻辑运算符中还有一个表示“否定”的 !。
它会返回将后续布尔值反转后的结果。
let a = true;
if (!a) {
console.log('a为真,但是不满足反转之后的条件。');
}
如果将布尔值以外的值指定为条件会怎样?
如果在 if 语句的条件表达式中指定了布尔值和比较运算符以外的内容,结果如下。
这用于数组或对象的 null 检查等。
| 类型 | 变为 false 的例子 | 变为 true 的例子 |
|---|---|---|
| 数值 | 0, NaN | 上述以外的数值(包括负数) |
| 字符串 | 空字符串 '' | 上述以外的字符串(包括字符串 '0') |
| 数组、对象 | 无 | 所有(包括空数组和空对象) |
null, undefined | 所有 | 无 |
条件分支(条件运算符)
条件运算符(也称为三元运算符),简单来说就是用于将分支处理写在一行中的写法。
在 rmmz 的核心脚本中也频繁使用。
语法
『条件式』 ? 『满足条件时』 : 『不满足条件时』
示例
let aaa = 1;
let bbb = (aaa === 1 ? 2 : 3);
console.log(bbb);
在上面的例子中,赋值给 aaa 的值是 1,所以 bbb 中被赋值为 2。
条件运算符也可以用前面讲过的 if 语句代替。
那么条件运算符的优点是什么呢?在于它可以将条件分支表达为一个单一的表达式。
在 rmmz 中,技能和物品的计算式也可以使用脚本,但输入栏只有一行。
下面的例子是在普通攻击的伤害计算公式中追加了使用条件运算符的判断。
b.isStateAffected(5) 这个条件表达式虽然看起来不熟悉,但它的意思是“如果攻击目标附加了状态 ID 为 5 的状态”。
a.atk * 4 - b.def * 2 + (b.isStateAffected(5) ? 100 : 0);