1. 主页
  2. 文档
  3. 学习君土脚本
  4. 君土脚本 第一步
  5. 基础类型

基础类型

介绍

为了让程序有价值,我们需要能够处理最简单的数据单元:数字,字符串,结构体,布尔值等。

两(布尔值,boolean)

最基本的数据类型就是简单的真/*true*/或假/*false*/值,我们把它叫做两(boolean)(其它语言中也一样)。当我们直接显示布尔值时, 会打印英文字符串”true”和”false”. 我们可以使用条件(三元)运算符打印出”真”和”假”.

  定 已做: 两 = 假;
  定 晴天: 两 = 真;
  控制台.日志(已做);  // false
  控制台.日志(晴天);  // true
  控制台.日志(已做 ? '真' : '假');
  控制台.日志(晴天 ? '真' : '假');

数(数字,number)

君土脚本里的所有数字都是浮点数。 这些浮点数的类型是数(number)。 除了支持十进制和十六进制字面量,君土脚本还支持二进制和八进制字面量。

  定 十数: 数 = 10; //十进制
  定 十六数: 数 = 0x10; //十六进制
  定 二数: 数 = 0b10; //二进制
  定 八数: 数 = 0o10; //八进制
  控制台.日志(十数);  // 10
  控制台.日志(十六数);  // 16
  控制台.日志(二数);  // 2
  控制台.日志(八数);  // 8

文(字符串,string)

君土脚本程序的另一项基本操作是处理网页或服务器端的文本数据。 我们使用表示文本数据类型。 可以使用双引号(")或单引号(')表示字符串。

定 姓名: 文 = "张三";
姓名 = "李四";

我们还可以使用模版字符串,它可以定义多行文本和内嵌表达式。 这种字符串是被反引号包围(`),并且以${ 表达式 }这种形式嵌入表达式

定 名字: 文 = `王二`;
定 年龄: 数 = 37;
定 句子: 文 = `你好, 我是${ 名字 }。

我下个月将${ 年龄 + 1 }岁。`;

这与下面定义句子的方式效果相同:

定 句子: 文 = "你好, 我是" + 名字 + "。\n\n" +
    "我下个月将" + (年龄 + 1) + "岁。";

数组

君土脚本可以操作数组元素。 有两种方式可以定义数组。 第一种,可以在元素类型后面接上[],表示由此类型元素组成的一个数组:

定 数列: 数[] = [1, 2, 3];

第二种方式是使用数组泛型,组<元素类型>

定 数列: 组<数> = [1, 2, 3];

对象(Object)

在编程中,对象是现实生活中的模型的一种代码结构。您可以有一个简单的对象,代表一个停车场,并包含有关其宽度和长度的信息,或者您可以有一个代表一个人的对象,并包含有关他们的名字,身高,体重,他们说什么语言,如何说 你好,他们,等等。

尝试在您的控制台输入以下行:

定 狗 = { 名字 : '大黄', 颜色 : '黄' };

要检索存储在对象中的信息,可以使用以下语法:

狗.名字

我们现在不会看对象 – 您可以在将来的模块中了解更多关于这些对象的信息.

元组( Tuple)

元组类型允许表示一个已知元素数量和类型的数组,各元素的类型不必相同。 比如,你可以定义一对值分别为文(string)数(number)类型的元组。

// 声明一个元组类型
定 x: [文, 数];
// 初始化它
x = ['你好', 10]; // 正确
// 错误初始化
x = [10, '你好']; // 错误

当访问一个已知索引的元素,会得到正确的类型:

控制台.日志(x[0].子(1)); // 正确
控制台.日志(x[1].子(1)); // 错误, '数' 没有方法 '子'

举(枚举,enum)

举(enum)类型是对君土脚本标准数据类型的一个补充。 使用枚举类型可以为一组数值赋予友好的名字。

举 颜色 {红, 绿, 蓝}
定 背景色: 颜色 = 颜色.绿;

默认情况下,从0开始为元素编号。 你也可以手动的指定成员的数值。 例如,我们将上面的例子改成从1开始编号:

举 颜色 {红 = 1, 绿, 蓝}
定 背景色: 颜色 = 颜色.绿;

或者,全部都采用手动赋值:

举 颜色 {红 = 1, 绿 = 2, 蓝 = 4}
定 背景色: 颜色 = 颜色.绿;

枚举类型提供的一个便利是你可以由枚举的值得到它的名字。 例如,我们知道数值为2,但是不确定它映射到颜色里的哪个名字,我们可以查找相应的名字:

举 颜色 {红 = 1, 绿, 蓝}
定 颜色名: 文 = 颜色[2];

控制台.日志(颜色名);  // 显示'绿'因为上面代码里它的值是2

化(任意值)

有时候,我们会想要为那些在编程阶段还不清楚类型的变量指定一个类型。 这些值可能来自于动态的内容,比如来自用户输入或第三方代码库。 这种情况下,我们不希望类型检查器对这些值进行检查而是直接让它们通过编译阶段的检查。 那么我们可以使用化(any)类型来标记这些变量:

定 不确定: 化 = 4;
不确定 = "可以是文本";
不确定 = 假; // 可以, 一个两型值

在对现有代码进行改写的时候,化(any)类型是十分有用的,它允许你在编译时可选择地包含或移除类型检查。 你可能认为对象(Object)有相似的作用,就像它在其它语言中那样。 但是对象(Object)类型的变量只是允许你给它赋任意值 – 但是却不能够在它上面调用任意的方法,即便它真的有这些方法:

定 不确定: 化 = 4;
不确定.如果存在(); // 可以, '如果存在' 在运行时要存在
不确定.修好(); // 可以, 修好 存在 (编译器不检查)

定 很确定: 对象 = 4;
很确定.修好(); // 错误: 方法 '修好' 不存在于 '对象'类型中.

当你只知道一部分数据的类型时,化(any)类型也是有用的。 比如,你有一个数组,它包含了不同的类型的数据:

定 列表: 化[] = [1, 真, "自在"];

列表[1] = 100;

注意: 在君土脚本里, 尽可能不使用这个类型. 当使用类型, 编译器有可能不能把标注名称翻译成对应的原始名称.

无(无效的,void)

某种程度上来说,无(void)类型像是与化(any)类型相反,它表示没有任何类型。 当一个函数没有返回值时,你通常会见到其返回值类型是无(void)

务 提示用户(): 无 {
    控制台.日志("这是我的测试信息");
}

声明一个无(void)类型的变量没有什么大用,因为你只能为它赋予灭(undefined)

定 没有用: 无 = 灭;

空(Null) 和 灭(Undefined)

君土脚本里,灭(undefined)空(null)两者各自有自己的类型分别叫做灭(undefined)空(null)。 和无(void)相似,它们的本身的类型用处不是很大:

// 我们不能为这些变量赋其它的值!
定 m: 灭 = 灭;
定 k: 空 = 空;

默认情况下空(null)灭(undefined)是所有类型的子类型。 就是说你可以把空(null)灭(undefined)赋值给数(number)类型的变量。

戒(Never)

戒(never)类型表示的是那些永不存在的值的类型。 例如,戒(never)类型是那些总是会抛出异常或根本就不会有返回值的函数表达式或箭头函数表达式的返回值类型; 变量也可能是戒(never)类型,当它们被永不为真的类型保护所约束时。

戒(never)类型是任何类型的子类型,也可以赋值给任何类型;然而,没有类型是戒(never)的子类型或可以赋值给戒(never)类型(除了戒(never)本身之外)。 即使化(any)也不可以赋值给戒(never)

下面是一些返回戒(never)类型的函数:

// 返回 戒 的函数必须存在无法达到的终点
务 错误(提示: 文): 戒 {
    抛 启 错(提示);
}

// 推断的返回值类型为戒
务 失败() {
    抛 错("错误了");
}

// 返回戒的函数必须存在无法达到的终点
务 无限循环(): 戒 {
    复 (真) {
    }
}

类型断言

有时候你会遇到这样的情况,你会比君土脚本更了解某个值的详细信息。 通常这会发生在你清楚地知道一个实体具有比它现有类型更确切的类型。

通过类型断言这种方式可以告诉编译器,“相信我,我知道自己在干什么”。 类型断言好比其它语言里的类型转换,但是不进行特殊的数据检查和解构。 它没有运行时的影响,只是在编译阶段起作用。 君土脚本会假设你,程序员,已经进行了必须的检查。

类型断言有两种形式。 其一是“尖括号”语法:

定 那值: 化 = "这是一个文本";

定 文长: 数 = (<文>那值).长;

另一个为语法:

定 那值: 化 = "这是一个文本";

定 文长: 数 = (那值 作 文).长;

两种形式是等价的。 至于使用哪个大多数情况下是凭个人喜好;然而,当你在君土脚本里使用网页程序(JSX)时,只有作(as)语法断言是被允许的。