TypeScript 这般代码,倒有些意思。想起从前那些个代码,不过是任由你胡乱写,运行结果如何,还得瞧天意。而今,这 TypeScript 倒是更像有了规矩,明文告示,若是错了,便不容你再行狡辩。

首先说这基础数据类型,大抵也不过如此——数字number、字符string、真假boolean,这些都见过。只不过,这枚举enum,却颇有些自负。定了个红绿蓝的名号,Red, Green, Blue,也不许你多改,只管按它的规矩办。至于什么nullundefined,是非之地,岂能让人放心?


// 周某人的第一行 TypeScript 代码
const hello : string = "Hello World!"
console.log(hello) // 输出 "Hello World!"

// number:双精度 64 位浮点值。它可以用来表示整数和浮点数。
const int:number = 1024
console.log(int)    // 输出 1024
const float:number = 10.24
console.log(float) // 输出 10.24

// string:一个字符系列,使用单引号(')或双引号(")来表示字符串类型。反引号(`)来定义多行文本和内嵌表达式。
const str_1:string = '123'
const str_2:string = "456"
const str_3:string = `789`
console.log(str_1, str_2, str_3) // 输出 "123",  "456",  "789" 

// boolean:表示逻辑值:true 和 false。
const flag: boolean = true
console.log(flag) // 输出 true

// enum:枚举类型用于定义数值集合。
enum Color {Red, Green, Blue};
let c: Color = Color.Blue;
console.log(c);    // 输出 2

上述代码体验链接: www.typescriptlang.org/zh/play

再看这变量声明,从前那‘任意写法’早已成为历史。如今,你得明确告诉它——‘这是个string,那是个number。你若不说,它也给你个undefined。规矩虽严,倒也比从前井然有序。然则,终有些任性者,名为any,生得桀骜,凡事皆可尝试,任意妄为,最后如何,却也难言。

var uname:string = "hello";
console.log(uname) // 输出 "hello" 

// 声明变量没有设置类型和初始值,类型可以是任意类型,默认初始值为 undefined:
var value;
console.log(value) // 输出 undefined 

上述代码体验链接:www.typescriptlang.org/zh/play

更妙的是这作用域,仿佛分得十分清楚。那些站在外面的,全局的,你无论走到哪里,总会遇见;可那些局部的,缩在一角,似乎非得凑近了才见。至于类里的变量,就更像是‘家法’——类中的静态者,任谁都能管;而那些实例变量,倒得等到生成了‘对象’才算真正活起来。

var global_num = 12          // 全局变量
class Numbers { 
   num_val = 13;             // 实例变量
   static sval = 10;         // 静态变量
   
   storeNum():void { 
      var local_num = 14;    // 局部变量
   } 
} 
console.log("全局变量为: "+global_num)  // 12
console.log("静态变量为: "+Numbers.sval)  // 10
var obj = new Numbers(); 
console.log("实例变量: "+obj.num_val) // 13

上述代码体验链接:www.typescriptlang.org/zh/play

如此,TypeScript不过是给了程序一副新衣裳,规矩更多,限制也多。但若真写得好,倒也如那Hello World一般,行云流水,无甚阻碍。

敝人带各位看官再看看这 TypeScript 中的运算符

算术运算符,这是最简单的东西,若是只停留在加减乘除这般浅显的表象上,倒也没什么深意。程序员们用 +-*/ 这些符号来算计一堆数字,仿佛在追求什么数学的精确,实则不过是依着机器的运作罢了。且看那“自增”和“自减”,++--,似乎要让程序自己学会进步和退让,倒显得有些虚伪。机器毕竟是死的,哪懂什么是进,什么是退?

var num1:number = 10 
var num2:number = 2
var res:number = 0

res = num1 + num2 
console.log("加:"+res);  // 输出: "加:12" 

res = num1 - num2; 
console.log("减:"+res)  // 输出: "减:8" 

res = num1*num2 
console.log("乘:"+res)  // 输出:  "乘:20" 

res = num1/num2 
console.log("除:"+res) // 输出:  "除:5"

res = num1%num2 
console.log("余数:"+res)  // 输出:  "余数:0"   

num1++ 
console.log("num1 自增运算: "+num1)  // 输出:  "num1 自增运算: 11" 

num2-- 
console.log("num2 自减运算: "+num2) // 输出:  "num2 自减运算: 1" 

至于关系运算符,看似在做比较,实则多半是空自猜度。你说==是平等的,!=是不平等的,可机器又如何真知这平等与否?它只管算着,><>=<=,数字在它眼里不过是大与小的标记。我们呢,不过是用这些标记来试图分辨世界的高低。

// ……
var res = num1>num2 
console.log("num1 大于 num2: "+res)

逻辑运算符,大概是编程里最迷人的诡辩术。我们常常要用&&||来判定某件事的真假,而这短路的逻辑,倒似乎是一种偷懒的捷径。比如&&,非得左右都对了才算真,可这左右,是否真的都是对的?||更是滑稽,只要有一方稍稍站住了脚,便可认为是全对。至于!,那便是彻头彻尾的反叛,可这反叛,倒是合乎机器的道理。

// ……
var res:boolean = ((avg>50)&&(percentage>80)); 
console.log("(avg>50)&&(percentage>80): ",res);

赋值运算符,这是一种令人沉思的象征。= 看似简单,却几乎掌握了程序的生杀大权。你想要什么,就赋给它什么,+=-=*=等,不过是表面上的操作,背后依然是服从与控制的关系。机器顺从地接受这些命令,仿佛并无怨言,然则我们呢?是否真的明白自己在给机器赋予什么?

// ……
a += b;
console.log("a+=b: "+a)

再说这三元运算符,也许是最为象征性的存在。看似在判定两个不同的选择,Test ? expr1 : expr2,其实不过是在依赖一个简单的真假测试,来决定所谓的“命运”。这命运的真相,只在那瞬间的Test里揭示,但人类的选择呢?是不是也如此简单粗暴?

// ……
var result = num > 0 ? "大于 0" : "小于 0,或等于 0";

最后,还有那字符串运算符类型运算符。用 + 来连接两个字符串,仿佛两者真的可以如此轻易融合。而typeof,则是那种让机器自知其身的尝试。我们问它,“你是什么类型?” 它只会回答一句简短的numberstring或其他,这些答案终究也只是在分类,而分类并不意味着理解。

// ……
let num = 1024
console.log(typeof num);   //输出结果: number

其实还有一种叫位运算,理解起来比较费脑,需要以机器的思维从 01 的角度去思考。

位运算,倒像极了从前乡下的‘老账’,账簿上那些细小的数字,一笔一划,代表着人情债务的来往。可如今这位运算,却将这些‘账簿’搬到了机器里头,只剩下01的世界,不问人情,不看情面,只看那微末的位上如何转动。

位运算之妙,正在于它‘偷工减料’的精确。你若问它‘与’(&)是何物,它会告诉你:两个1才是真,其他皆为假。这个规则简单得让人哭笑不得,仿佛两个人非得同时点头,方能作数;若有一人摇头,那便毫无结果。

let a = 5; // 0101
let b = 3; // 0011
console.log(a & b); // 输出1: 0001

至于‘或’(|),倒是有些宽厚,只要有一个1,便可认为是对的。这规则倒像是某些无关紧要的交情,只要有一个人在意,便能算作成立。它甚至不介意其他人如何,只要有一点希望,便可通融。

console.log(a | b); // 输出7: 0111

再说这‘异或’(^),却颇有些桀骜的味道。它只认不相同的,若两个数一样,便视作无效。像极了某些不合群的性情,非要在差异中寻找意义。

console.log(a ^ b); // 输出6: 0110

‘取反’(~)则是极端的反叛者,凡是1,它便反成0;凡是0,它又偏要反成1。这种彻底的对立,倒有几分像“愤怒的青年”,满怀否定,不愿服从任何现状。

console.log(~a); // 输出-6

最有趣的,便是这‘左移’(<<)与‘右移’(>>)。这二者像是时间的年轮,将所有的位数推向更高或更低的地方。你将数字往左一推,数字便瞬间翻倍,仿佛是从无到有的奇迹;而若向右移,则仿佛让时间倒流,数字随之削减,直至无影无踪。

console.log(a << 1); // 输出10: 1010
console.log(b >> 1); // 输出1: 0001

位运算,这般操作虽然精密,却充满了冷酷无情的机械性。它不懂得人的复杂情感,只管依照固定的规则运转。你说它强大也罢,简单也罢,终究不过是机器间的无声博弈。这些‘0’和‘1’,其实是现代人生活的缩影,彼此之间碰撞交织,却未曾真正懂得对方的意义。”

一言以蔽之,TypeScript里这些运算符,像极了我们对世界的操控欲,但却不曾真正理解背后的意义。我们操控了机器,而机器却也反映了我们的局限。

上述运算符完整代码体验链接:www.typescriptlang.org/zh/play

参考资料

以上文字内容几乎全部由 ChatGPT 编写创作

huqi
833 声望15 粉丝

我以为的就是我以为的?