变量
rmmz中有“变量”这一概念,可以通过事件命令“变量操作”为其命名,自由地代入或累加数值。
相同的机制也存在于js中。
本章将从js变量与rmmz变量的区别,一直讲解到活用方法。
变量的声明
首先,与rmmz变量不同,js中需要“声明”变量。
声明就是告诉程序“我要用指定的名字定义一个变量”。
变量不声明就无法使用。
let aaa = 0;
上述例子中,声明了要使用名为“aaa”的变量,并同时赋值为0。
事件命令的变量一开始就含有0,但js变量如果不赋值,则什么也没有。
准确地说,里面存放的是表示“未定义”的特殊值undefined。
let是为了声明而必需的、语法规定的写法。
除let外,js中还有一些语法规定的写法或词语,这些被称为“保留字”。
而变量名“aaa”可以由你自由决定。但不能使用上述保留字或部分符号。
另外,重复定义同名的变量会报错。
Uncaught SyntaxError: Identifier 'aaa' has already been declared
行尾的分号
仔细观察上面的脚本,最后面附有一个分号“;”。
这是为了明确表示语法结束的符号,但不加也能正常运行。
加不加取决于个人,都可以。
重要的是“保持统一感”。
时加时不加会招致混乱。
关于let以外的变量声明方法
在旧作RPG Maker MV(以下简称MV)中使用过脚本的人,或许对保留字var有印象。
var也能像let一样声明变量。
在rmmz中也可以使用var声明,但这是稍旧的写法。
使用它虽然不会造成大的实际危害,但到了制作插件阶段,变量作用域(有效范围)等细微差异会变得明显。
如果没有特别的理由或坚持,请使用let。
此外还存在另一个声明用的保留字const。
你可能会想:“光是变量声明就弄出这么多种类,让人很困扰啊……”。
const在当前阶段难以解释,留待后述。
总之先记住let吧。
数值计算
在事件命令“变量操作”中,除了代入,加法和乘法等基本计算也是可能的。
js变量当然也能做到。
首先定义变量。
let x = 1;
然后分别如下描述。
| 种类 | 脚本写法 | 结果 | 缩写版脚本 |
|---|---|---|---|
| 加法 | x = x + 1; | 2 | x += 1; |
| 减法 | x = x - 1; | 0 | x -= 1; |
| 乘法 | x = x * 2; | 2 | x *= 2; |
| 除法 | x = x / 2; | 0.5 | x /= 2; |
| 求余 | x = x % 2; | 1 | x %= 2; |
这样计算结果就会被存入变量“x”。
用console.log(x);来确认内容吧。
执行时使用“脚本”列还是“短缩版脚本”列都可以。
我想可以明白,可以用与事件命令相同的感觉来操作变量。
此外,当加、减的值为1时,还可以进一步缩短为如下形式。
x++;
x--;
这被称为递增运算符、递减运算符,在实际编程中也频繁使用。
除法运算的两点注意
事件命令中执行除法时,若无法整除,会被向下取整。
但在js中,不会自动进行四舍五入或向下取整。
另外,关于除以0的行为:若被除数为正数,返回特殊值Infinity;若为负数,返回-Infinity。
这种行为其实也可以在事件命令中再现。
变量的类型
事件命令的变量中只能放入“数值”。
但在js中,变量可以存储数值以外的值。
代表性类型如下:
- 布尔值(true/false)
- 字符串
- null
- undefined
- 数组
- 对象
- 函数
布尔值(真/假)与事件命令中的“开关”相同。开关 ON 用 true 表示,开关 OFF 用 false 表示。
let aaa = true;
字符串是中文、日文、英语、符号等文字的排列。
字符串的开头和结尾用单引号 ' 或双引号 " 括起来。
let aaa = 'test mzあああ!"#$%';
null 表示“什么都没有的状态”。
它与之前提到的 undefined 概念相近,但 undefined 是“未定义任何东西”的状态,而 null 可以说是“定义了没有东西”的状态。
let aaa = null;
关于数组、对象、函数,因为较复杂,将在后面说明。
数组
在前项说明的变量类型中,“数组”和“对象”稍微复杂一些。
它们可以集中处理多个变量。
首先是数组,它是将值横向排列并统一处理的变量。
let aaa = [1, 2, 3, 4];
要引用其内容,如下记述。
console.log(aaa[0]);
括号中指定的 0 称为“索引”,用于指定引用数组中的哪个位置。
另外,里面存放的 1 或 2 等称为“元素”。
最左边元素的索引是 0,然后依次递增为 1, 2…
也就是说,执行上述脚本后,会显示第 0 个元素 1。
另外,在数组后面加上 .length 可以获取数组的元素个数。
console.log(aaa.length);
对象
数组是以数值为索引来汇总多个变量。
另一方面,以字符串为索引的就是“对象”。
这接近于其他语言中的“关联数组”或“结构体”。
(严格来说略有不同,js 中另有正式的关联数组,但此处省略说明)
let aaa = {bbb:1, ccc: 2, ddd: 3};
数组中使用“索引”一词,而对于对象,bbb、ccc 等通常称为“属性”。
与数组类似,引用时如下记述。
因为是字符串,不要忘记前后加上单引号。
console.log(aaa['bbb']);
上述结果返回 1。
此外,对于对象,还可以进行如下引用。
console.log(aaa.bbb);
这种情况下不需要括号和单引号,但属性名中不能使用符号(除下划线等部分符号外)。
这种使用 . 的属性引用,在核心脚本中也频繁使用。
请在这里牢固掌握基础。
aaa.bbb 的意思是引用对象 aaa 的属性 bbb。
应用篇
现在使用已学的知识尝试运行复杂的程序。请确认自己是否真正理解了内容。
请尝试执行以下脚本。但请尽量不要复制,而是亲自逐字输入。
let obj = {prop1:0, prop2:1};
obj.prop1 += obj.prop2;
let propName = 'prop3';
obj[propName] = 5;
let num = obj.prop3;
console.log(obj.prop1 + obj.prop2 / num);
逐行解释如下。
- 声明变量
obj,并存入新创建的对象。 - 将
obj的属性prop2的值加到属性prop1上。prop1中存入0 + 1,即1。 - 声明变量
propName,存入字符串prop3。 - 为变量
obj创建新属性。属性名是“变量propName的值”,即prop3。 - 将前一行定义的
obj.prop3赋值给变量num。因此num中存入5。 - 最后输出
prop1+prop2/num的计算结果。可以像现实数学一样组合多个运算。
首先值得一提的是第 4 行。
这里在属性中指定了变量。
在 js 中,引用属性时可以基于“变量的值”来进行引用。
这个技巧将来会派上用场。
其次是第 6 行。
在事件命令中,一个命令只能执行一个计算。
而在 js 中,与现实数学一样,可以在一个语法内进行多个计算。
顺便问一下,您是否记得数学中运算有优先级?
加法和乘法中,乘法优先计算。
因此结果是 1 + 1 / 5,输出 1.2。
关于输入补全
当手动输入上述脚本时,输入到第 2 行的 obj 时,我想会弹出如下所示的列表。
这称为“输入补全”,是开发者工具预测您将要输入的内容并给出候选的功能。
通过此功能可以减少输入错误和语法错误,请善加利用。
