进击的小羊

再看JS

作为一名JAVA语言的开发者,对静态语言的习以为常后,再去学习动态语言,简直有种野兽出笼的感觉,到处都会产生:还可以这样!!的感叹。对,JS就是一门让我大喊卧槽的语言。

我为什么要学习JS?因为江湖上有个传言–学会了JS,你就是全栈。这样说虽然有点夸大,但是也是有道理的。什么是全栈工程师?

他们能够自己构建和部署一个完整的、可以工作的应用程序,而不需要其他任何人的帮助。

JavaScript是世界上最流行的脚本语言,加上Node.js和react的火热,让JS通吃了web,后端,移动端。也就是说你学会了JS,你就可以独立的完成一个想做的项目,这对一名移动端开发者的吸引力是巨大的,因为他们时常会因为有了一个很好的想法,苦于没有后端服务支撑而烦恼。我对此深有体会,工作之前我是一名不折不扣的个人开发者,因为没有后端支撑,我的dreamlist中很多想法都一直放着,一直至今都苦于自己没有一门称手的后端语言。现在好了,穷人要翻身,让我们看看这门奇妙的语言。

首先让我感觉到不适的是JavaScript的类型是可以改变的,var就是一个世界,他可以是任何类型,而且初始化之后还可以重新赋值为另一种类型。这就是传说中的动态语言,简直就是终结者中的变形人。

然后就是神奇的闭包,高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。看一个来之雪峰总的例子:
实现一个对Array的求和,如果不需要立刻求和,而是在后面的代码中,根据需要再计算怎么办?可以不返回求和的结果,而是返回求和的函数!

1
2
3
4
5
6
7
8
function lazy_sum(arr) {
var sum = function () {
return arr.reduce(function (x, y) {
return x + y;
});
}
return sum;
}

当我们调用lazy_sum()时,返回的并不是求和结果,而是求和函数:

1
var f = lazy_sum([1, 2, 3, 4, 5]); // function sum()

调用函数f时,才真正计算求和的结果:

1
f(); // 15

这在JAVA的世界中简直是不可能的,对象就是对象,方法就是方法,每次调用方法必须穿参数,怎么可能出现调用方法然后又返回了一个方法,这种事只能睁大眼睛接受,这就是JS的一大杀器—-闭包,闭包的最大意义就是更强大的抽象能力。

接着有意思的就是JS的各种语法糖,好吃又好玩。比如箭头函数(ES6才支持)

1
x => x * x

其相当于

1
2
3
function (x) {
return x * x;
}

箭头函数相当于匿名函数,并且简化了函数定义。之前看react的时候总是感觉到有点陌生,就是一个很多地方使用了箭头函数,这在普遍使用各种智能IDE的JAVA世界,也有点太随意了。其实不然,Lambda表达式

1
x -> 2 * x

呵呵,看来JAVA和JS就像Android和iOS一样,越来越像,这里郑重声明如有雷同纯属巧合。

再看JS的后端实现Node.js,一个叫Ryan Dahl的歪果仁,独自一个人就搞出来了,这段故事非常有趣,想了解详情的看这里,老外也真是各种屌,Brendan Eich这哥们在两周之内设计出了JavaScript语言,Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git。我上学那伙也是1周能把一个奇思妙想实现出来,当初刚学会Android,感觉自己有了很好的方式表达自己的想法,就开始疯狂的创作App,那时候的自己更像一名艺术家。有点跑题。。。

因为Node.js基于JS,所以会了JS再学Node.js非常简单,诺~ 这就是个Node.js程序

1
2
3
'use strict';

console.log('Hello, world.');

其他的就是各种模块的方法使用,万变不离其宗,想写出自己的后端程序,还是先学好JS,所有语言都是这样,hello world 简单,goodbye world 难,要想会用JS 100小时足以,但是要想成为JS大神10000小时不够。

对我来说,我需要的是一门表达自己的后端语言和React基础,所以必须要学好JS。