如果再学一种编程语言,会选择哪个语言呢?

当然是 JS (Javascript) 啦!

原因有很多。

随手可得

假设现在需要将一段字符串转成大写字母,例如转换 Hello World 为大写,最快的方式是怎样的?

有些人可能会打开 Visual Studio 新建工程等等

有些人可能会打开命令行进入 Python 的交互模式

有些人可能会打开在线 IDE 输入代码运行。

如果是学习过 JS 的人就会直接在浏览器中按 F12 打开控制台输入

1
2
"Hello World".toUpperCase()
// => "HELLO WORLD"

就这么简单快速。因为浏览器内置了 JS 的运行环境。所以无论走到哪里,无论是谁的电脑。只要有浏览器就可以运行 JS 代码。

脚本语言

脚本语言的优点有很多。跟编译型语言不同的是脚本语言是解释执行的。也就是脚本语言通常都有 REPL (Read, Eval, Print, Loop) 。

简单的说就是可以交互式编程。一边写一边运行。

平时写编译型语言都是很大一部分才能运行。而如果是脚本语言可以一句一句来写。快速的迭代,直到完成后,将所有代码复制到一个文件就写完了。

函数式编程

现在函数式的讨论很火热。许多语言纷纷加入对函数式编程的支持。

函数式编程最基本的一点是函数是第一公民(First Class)。

也就是函数跟其他类型,比如整数,在使用上可以很方便的定义,传递和返回。

有些语言不支持匿名函数,所以得先定义函数,在通过变量引用函数,通过传递这个变量才能传递函数。

有些语言不支持传递和返回函数,只能通过面向对象的方式模拟。

而在 JS 里全都支持。函数式编程在 JS 里很自然也很简单。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 定义匿名函数
(function(){return "Hello World";})
// => function(){return "Hello World";}

// 定义匿名函数并立刻求值
(function(){return "Hello World";})()
// => "Hello World"

// 将函数作为值传递
/// 直接赋值
var hello = function(){return "Hello World"};
/// 传递
function sayHello(f){console.log(f())};
sayHello(function(){return "Hello World"});
// => Hello World

// 返回函数
var plusOne = function(){
return function(number){
return number + 1;
}
}
/// 可以这么用
[1,2,3].map(plusOne());
// => [2,3,4]

当然还支持 柯理咖喱 化(Curring),函数组合,单子,匿名递归等。

这并不意味着 JS 只能使用函数式编程。实际上 JS 支持多范式编程。比如支持面向对象编程,支持过程式编程。甚至如果愿意的话也可以支持面向组合子编程。

虚拟机和垃圾回收

有了垃圾回收(Garbage Collect)之后在写小程序的时候不用担心内存的问题了。也不用计较分配内存,手动释放内存。真的很方便。

JS 运行在虚拟机上。通常宿主语言会比较慢。

以前的 JS 确实比较慢。但是自从谷歌希望开发了 V8 引擎后在某些情况下速度甚至比传统编译型语言还要快。

非常流行

JS 曾经获得 Github 公布的语言排行榜 2014 年和 2016 年的冠军。

在 Github 上最热门的语言就是 JS

最近很火热的微信小程序所使用的编程语言也是 JS

这对于一个诞生于 1995 年的语言来说真的很不容易,尤其在现在优秀语言倍出的大背景下。

丰富的库

作为 JS 流行的必然结果,JS 拥有很多类库。

比如杀手级的类库 jQuery 。用于操作浏览器中的标签对象 (DOM)。

又比如基于 MVVM 的框架 AngularJS 。大大方便了单页应用(SPA)的开发。

又比如改善异步编程的 Promise 等等。每一个库都能让我水好多篇文章

在 JS 的世界里,你有丰富的轮子可选,你遇到的问题基本上都有相应的轮子来解决。如果不满意你还可以自己造轮子。

买一送二

学习了 JS ,就不会仅仅学习 JS 。

因为 JS 跟浏览器密切相关。

浏览器中页面的显示使用 Html (How To Make Love Hyper Text Markup Language,超文本标记语言) 和 CSS (层叠样式表)

于是就顺便学了 Html 和 JS。

买一送二啊。世界上哪有这等好事。

这样就很自然地会做网页了。

哇!一个年薪 20K 的前端程序员诞生了!

不局限于浏览器

JS 虽然跟浏览器紧紧相连。但不是说 JS 只能在浏览器中运行。

使用谷歌 V8 引擎 + Node.js 即可编写桌面应用程序。而且还是跨平台的。

比如 Viusal Studio Code 就是这么做的。

用网页的方式控制外观比传统的使用控件方便多了,而且更加灵活。学习成本低。只要会 CSS 就能绘制画面。

JS 还可以编写移动应用。

通过 PhoneGap 等框架可以开发 Native app 。也就是不懂 Java ,OC 和 Swift 也可以写移动应用。只需要会 JS 就行。

JS 还可以编写嵌入式程序。

espruino 和 Tessel 都支持使用 JS 进行嵌入式编程。

JS 除了用于客户端,还可用于服务端。

比如淘宝,Paypal等公司都有使用 JS 写服务器。

这样的一个好处是前后端数据统一。而且 JS 天生支持异步编程。很适合用于高并发的场景。 这是另外一个好处。

最大的好处当然是不用学习世界上最好的语言啦

一个语言就能前后端通吃,世界上还有第二个这样的语言吗?

一切能用 JS 编写的都将用 JS 重写。

与 C 语法类似

JS 的语法和 C 语言大部分类似。

这意味着学习成本大幅降低啊。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 函数调用
console.log("Hello World");

// 循环语句
for(var i = 0;i < 10;i++){
console.log(i);
}

// 条件语句
if(2 > 1){
console.log("Yes");
}else{
console.log("no");
}

既然跟 C 语言语法类似。那还要学习什么呢?

当然是学习一些不类似的情况。

最起码要能一次性答对 JS 常见问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[]==[]
// => false

'5' + 3
// => "53"
'5' - 3
// => 2

2 == [[[2]]]
// => true

3.toString()
// => error
3..toString()
// => "3"
3...toString()
// => error

var min = Math.min(), max = Math.max()
min < max
// => false

var END = Math.pow(2, 53);
var START = END - 100;
var count = 0;
for (var i = START; i <= END; i++) {
count++;
}
console.log(count);
// endless loop

也不是太难嘛(逃

可扩展

JS 最大的优点是可扩展。不爽可以写一个库啊。如果还不行那就写一个转译成 JS 的语言啊。

如果你觉得写语言太麻烦可以直接使用现成的。比如 CoffeeScript

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 赋值:
number = 42
opposite = true

# 条件:
number = -42 if opposite

# 函数:
square = (x) -> x * x

# 数组:
list = [1, 2, 3, 4, 5]

# 对象:
math =
root: Math.sqrt
square: square
cube: (x) -> x * square x

# Splats:
race = (winner, runners...) ->
print winner, runners

# 存在性:
alert "I knew it!" if elvis?

# 数组 推导(comprehensions):
cubes = (math.cube num for num in list)

将转译成以下 JS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
var cubes, list, math, num, number, opposite, race, square,
__slice = [].slice;

number = 42;

opposite = true;

if (opposite) {
number = -42;
}

square = function(x) {
return x * x;
};

list = [1, 2, 3, 4, 5];

math = {
root: Math.sqrt,
square: square,
cube: function(x) {
return x * square(x);
}
};

race = function() {
var runners, winner;
winner = arguments[0], runners = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
return print(winner, runners);
};

if (typeof elvis !== "undefined" && elvis !== null) {
alert("I knew it!");
}

cubes = (function() {
var _i, _len, _results;
_results = [];
for (_i = 0, _len = list.length; _i < _len; _i++) {
num = list[_i];
_results.push(math.cube(num));
}
return _results;
})();

微软脑残粉还可以使用 M$ 山寨 JS 失败不死心后出的 Typescript

1
// 官网访问太慢懒得贴代码了。

Typescript 加上了静态类型,把解释执行的语言搞得类似编译型语言一样。

觉得太死板?可以用颜文字来写 JS

1
2
゚ω゚ノ= /`m´)ノ ~┻━┻   //*´∇`*/ ['_']; o=(゚ー゚)  =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o -(゚Θ゚)] ,゚Д゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];(゚Д゚) ['c'] = ((゚Д゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + ((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+((゚ー゚==3) +'_') [(゚ー゚) - (゚Θ゚)]+(゚Д゚) ['c']+((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚Д゚) ['o']+((゚ー゚==3) +'_') [゚Θ゚];(゚Д゚) ['_'] =(o^_^o) [゚o゚] [゚o゚];(゚ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+((゚Д゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚Θ゚]+((゚ー゚==3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_') [゚Θ゚]; (゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='\\'; (゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^_^o -(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ +'_')[c^_^o];(゚Д゚) [゚o゚]='\"';(゚Д゚) ['_'] ( (゚Д゚) ['_'] (゚ε゚+(゚Д゚)[゚o゚]+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚o゚]) (゚Θ゚)) ('_');
// => "Hello"

颜文字输入太麻烦?你可以只用 8 种字符写 JS

1
2
[][(![]+[])[!+[]+!![]+!![]]+([]+{})[+!![]]+(!![]+[])[+!![]]+(!![]+[])[+[]]][([]+{})[!+[]+!![]+!![]+!![]+!![]]+([]+{})[+!![]]+([][[]]+[])[+!![]]+(![]+[])[!+[]+!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[+!![]]+([][[]]+[])[+[]]+([]+{})[!+[]+!![]+!![]+!![]+!![]]+(!![]+[])[+[]]+([]+{})[+!![]]+(!![]+[])[+!![]]]((!![]+[])[+!![]]+([][[]]+[])[!+[]+!![]+!![]]+(!![]+[])[+[]]+([][[]]+[])[+[]]+(!![]+[])[+!![]]+([][[]]+[])[+!![]]+([]+{})[!+[]+!![]+!![]+!![]+!![]+!![]+!![]]+([][[]]+[])[+[]]+([][[]]+[])[+!![]]+([][[]]+[])[!+[]+!![]+!![]]+(![]+[])[!+[]+!![]+!![]]+([]+{})[!+[]+!![]+!![]+!![]+!![]]+(+{}+[])[+!![]]+([]+[][(![]+[])[!+[]+!![]+!![]]+([]+{})[+!![]]+(!![]+[])[+!![]]+(!![]+[])[+[]]][([]+{})[!+[]+!![]+!![]+!![]+!![]]+([]+{})[+!![]]+([][[]]+[])[+!![]]+(![]+[])[!+[]+!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[+!![]]+([][[]]+[])[+[]]+([]+{})[!+[]+!![]+!![]+!![]+!![]]+(!![]+[])[+[]]+([]+{})[+!![]]+(!![]+[])[+!![]]]((!![]+[])[+!![]]+([][[]]+[])[!+[]+!![]+!![]]+(!![]+[])[+[]]+([][[]]+[])[+[]]+(!![]+[])[+!![]]+([][[]]+[])[+!![]]+([]+{})[!+[]+!![]+!![]+!![]+!![]+!![]+!![]]+(![]+[])[!+[]+!![]]+([]+{})[+!![]]+([]+{})[!+[]+!![]+!![]+!![]+!![]]+(+{}+[])[+!![]]+(!![]+[])[+[]]+([][[]]+[])[!+[]+!![]+!![]+!![]+!![]]+([]+{})[+!![]]+([][[]]+[])[+!![]])())[!+[]+!![]+!![]]+([][[]]+[])[!+[]+!![]+!![]])()([][(![]+[])[!+[]+!![]+!![]]+([]+{})[+!![]]+(!![]+[])[+!![]]+(!![]+[])[+[]]][([]+{})[!+[]+!![]+!![]+!![]+!![]]+([]+{})[+!![]]+([][[]]+[])[+!![]]+(![]+[])[!+[]+!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[+!![]]+([][[]]+[])[+[]]+([]+{})[!+[]+!![]+!![]+!![]+!![]]+(!![]+[])[+[]]+([]+{})[+!![]]+(!![]+[])[+!![]]]((!![]+[])[+!![]]+([][[]]+[])[!+[]+!![]+!![]]+(!![]+[])[+[]]+([][[]]+[])[+[]]+(!![]+[])[+!![]]+([][[]]+[])[+!![]]+([]+{})[!+[]+!![]+!![]+!![]+!![]+!![]+!![]]+([][[]]+[])[!+[]+!![]+!![]]+(![]+[])[!+[]+!![]+!![]]+([]+{})[!+[]+!![]+!![]+!![]+!![]]+(+{}+[])[+!![]]+([]+[][(![]+[])[!+[]+!![]+!![]]+([]+{})[+!![]]+(!![]+[])[+!![]]+(!![]+[])[+[]]][([]+{})[!+[]+!![]+!![]+!![]+!![]]+([]+{})[+!![]]+([][[]]+[])[+!![]]+(![]+[])[!+[]+!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[+!![]]+([][[]]+[])[+[]]+([]+{})[!+[]+!![]+!![]+!![]+!![]]+(!![]+[])[+[]]+([]+{})[+!![]]+(!![]+[])[+!![]]]((!![]+[])[+!![]]+([][[]]+[])[!+[]+!![]+!![]]+(!![]+[])[+[]]+([][[]]+[])[+[]]+(!![]+[])[+!![]]+([][[]]+[])[+!![]]+([]+{})[!+[]+!![]+!![]+!![]+!![]+!![]+!![]]+(![]+[])[!+[]+!![]]+([]+{})[+!![]]+([]+{})[!+[]+!![]+!![]+!![]+!![]]+(+{}+[])[+!![]]+(!![]+[])[+[]]+([][[]]+[])[!+[]+!![]+!![]+!![]+!![]]+([]+{})[+!![]]+([][[]]+[])[+!![]])())[!+[]+!![]+!![]]+([][[]]+[])[!+[]+!![]+!![]])()(([]+{})[+[]])[+[]]+(!+[]+!![]+!![]+!![]+[])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+[]))+([][[]]+[])[!+[]+!![]+!![]]+(![]+[])[!+[]+!![]]+(![]+[])[!+[]+!![]]+([]+{})[+!![]]
// => Hello

满意了吗?还有哪个语言能这么灵活满足各种奇奇怪怪的要求?

最后

本文仅用于调侃 JS 。并不是用于安利 JS 。请不要相信文中的任何一本正经胡说八道的话。