挑战TJS Section1.3:变量

正篇

Yuu:上一次,我们写了一个获取当前是几点几分的脚本…

Yuni:嗯。

Yuu:上次我讲解了Date类中的一个部分,Date类还存在着可以获取年、月、日、星期几和秒的操作。总的来说,程序像这样。

var d = new Date();
System.inform(d.getYear());     // 表示“年”
System.inform(d.getMonth());    // 表示“月”
System.inform(d.getDate());     // 表示“日”
System.inform(d.getDay());      // 表示“星期几”
System.inform(d.getHours());    // 表示“时”
System.inform(d.getMinutes());  // 表示“分”
System.inform(d.getSeconds());  // 表示“秒”

Yuni:有好多啊~

Yuu:嘛,确实有很多啊,不过这些方法看上去都很易懂。不过…

Yuni:不过?

Yuu:getMonth()getDay()两个方法需要特别注意。

Yuni:为什么?

Yuu:正如你运行上面的脚本所示,getMonth()方法的结果比实际的结果小1.getDay()方法显示的是数字而不是一周中的星期几。

Yuni:哦还真是。2月的话,显示的是“1”;周一的话,显示的是“1”。

Yuu:没错。所以月份应该是getMonth()+1。同样的,getDay()得到的是0~6之间的整数,分别对应周日、周一、周二、周三、周四、周五、周六。这算是一种规定吧。

Yuni:了解。

Yuu:还有一点。

Yuni:嗯?

Yuu:第1行的Date类的方法:

var d = new Date();

Yuu:举个例子,如果这句话在12点55分被执行,然后你在5分钟后调用了其中的方法来获取几点几分。你将得到12:55而不是13:00。

Yuni:哦是这样?

Yuu:是的。当我们生成一个新的实体(例子中的d先生)时,会将当前的时间信息存入这个实体中。当我们调用它的方法时,并不会再去实际获取一下时间。

Yuni:哈,是这样…

Yuu:嗯,所以不管你执行相同的方法如getHours()多少次,得到的总是相同的结果。在一些地方请务必注意。

Yuni:嗯嗯。

Yuu:好啦。这次我要升级一下之前的脚本。

Yuni:升级?

Yuu:上一次,小时和分钟都是以数字的形式分开显示的,这有些难以理解。因此我想以“何年何月何日几时几分几秒”的形式来显示。顺便说一下,由于星期几的表示不好完成,这次先跳过。

Yuni:我明白了。

Yuu:下面我会使用变量

Yuni:变量,是一种能够记住数字、字符等等数据的“箱子”是吧?

Yuu:对,在KAG脚本中还是很常见的对吧。

Yuni:是滴。我之前用过它。比如写作f.hensuu这样。

Yuu:没错。

Yuni:f开始的变量是“游戏变量”,sf开始的是“系统变量”,tf开始的是“临时变量”。译者注:在KAG中,有三种预设的变量(其实是对象),就是上面提到的f, sftf。我们在KAG中可以直接使用”.”创建一个变量(属性)。比如角色的属性可以使用f.blood表示

Yuu:TJS变量的使用也是这样的道理。毕竟KAG的变量本质上就是用TJS书写的。不过,由于TJS不会自动存储起来,所以默认下它们都是临时变量。并且,在使用变量的时候,声明是必须的

Yuni:声明?

Yuu:对,声明就是“我要从现在开始使用这个变量了”。

Yuni:这个是必要的吗?

Yuu:嗯,这会有点违和感因为KAG变量的声明不是必需的

Yuni:嗯…

Yuu:TJS中,当你想要使用一个变量时,你需要使用关键字var来声明。

/变量的声明/

var variable;

Yuu:这就是变量的声明语句,表达“我从现在开始要使用variable了”。

Yuni:嗯?f, sftf都不需要在变量名中吗?

Yuu:哦,只有KAG变量才需要它们,普通的TJS变量不需要。

Yuni:真的吗?

Yuu:嗯。正因为不需要在KAG中声明变量,我们才需要在前面加上f, sftf译者注:f, sftf是KAG预设的3个字典对象,我们通过向它们添加属性来保存需要的值。看上去像是没有定义变量直接使用而已。

Yuni:哦是这样…那什么样的名字才可以用呢?

Yuu:你可以使用大写字母、小写字母、下划线、数字以及双字节字符的组合作为变量的名字。不过,变量名的开头字符不能是数字。并且,变量名不能是保留字中的任何一个。

/保留字/

break continue const catch class case
debugger default delete do extends export
enum else function finally false for
global getter goto incontextof Infinity
invalidate instanceof isvalid import int in
if NaN null new octet protected property
private public return real synchronized switch
static setter string super typeof throw
this true try void var while with

Yuu:我想命名规则与KAG的规则是相同的。加上,不能使用保留字。

Yuni:OK,明白了。

Yuu:举几个例子,变量名可以是这样。

/变量名的使用例子/

var x;                 // 最普通,一个字母
var Flag2;           // 字母数字混合
var _true;         // 包含保留字,但只要不是这个单词本身就可以
var 変数1;         // 全角文字和半角文字混合也是可以的
var 2つ目の変数;  // 第一个字符时全角数字也是可以的
var a&b;        // 不是“_”的全角符号也可以使用

Yuu:变量名不能是下面的几种情况

/不能使用的名字/

// var 1st;    // 开头字符不能是半角数字
// var a&b;  // 变量名中不能有非“_”的半角符号
// var true;  // 变量名不能完全是一个关键字

Yuu:另外注意,变量名是区分大小写的。

var ab;
var Ab;
var AB;
var aB;

Yuu:这些变量都会被视作不同的变量。

Yuni:KAG也是这样的呢。

Yuu:我们可以使用逗号“,”来分隔多个变量名。这样我们可以在一行声明中,声明多个变量。

var a, b, c, d

Yuu:这一行中就声明了a, b, c, d四个变量。

Yuni:嗯明白。

Yuu:那我们写一下使用getYear()方法,将获取的年分数值存入变量中的脚本。

/将年份数值存入变量的脚本/

var d = new Date();
var year;            // year在下面可以使用了
year = d.getYear();  // 年份数值存入year变量中

Yuu:我们定义了一个叫做year的变量,并且将getYear()方法的返回值赋值给它。现在是2018年,因此year的数值是2018.

Yuni:嗯,这和KAG中的变量用法完全一致。哦,你的意思是,创建的Date类的“d先生”,也是变量了?

Yuu:没错!事实上,可以通过创建“对象”变量来使用Date类的方法。

Yuni:是这样的~不过,一个变量中又有数值又有字母等等,这感觉有点奇怪…

Yuu:我想也是这样。嘛,下次我们会及讲解可以赋值给TJS变量的类型。

Yuni:嗯,这就到时间了?我还没写显示时间的脚本呢。

Yuu:哈哈,还有很长的路要走呢~现在就先到这里,下次见!

要点

  1. Date类的getMonth()方法的返回值比实际值小1.范围是0~11.

  2. Date类的getDay()方法的返回值是0~6之间的整数,1~6分别对应星期一到星期六,0对应星期日。

  3. Date类只有在使用new创建的时候才会真正地向系统获取当前时间。如果我们定义好了一个变量d,并且使用new创建好内容之后,d中的值就不会随着时间的推移而改变。也就是说,d中保存了new这个时刻的状态。在不更新这个状态的时候,使用任何方法获得的时间信息都是不变的。

  4. 变量是一个存储了一定类型数据的“单元”。在TJS中,变量在使用前必需先用var进行声明。同时,可以使用逗号“,”,在一条语句中声明多个变量。

  5. 变量的名字可以由大写字母、小写字母、数字、下划线、双字节字符组成。同时,第一个字符不能是数字,变量名不能和保留字完全相同。

  6. 保留字是TJS语言中具有一定含义的词语,它们定义了TJS中的基本操作。保留字也被称作“关键字”。

导航

上一篇:挑战TJS Section1.2:方法的使用

下一篇:挑战TJS Section1.4:变量的数据类型

挑战TJS系列

发表评论