学一些 Javascript
当然是 JS (Javascript) 啦!
原因有很多。
随手可得
假设现在需要将一段字符串转成大写字母,例如转换 Hello World
为大写,最快的方式是怎样的?
有些人可能会打开 Visual Studio 新建工程等等
有些人可能会打开命令行进入 Python 的交互模式
有些人可能会打开在线 IDE 输入代码运行。
如果是学习过 JS 的人就会直接在浏览器中按 F12
打开控制台输入
1 | "Hello World".toUpperCase() |
就这么简单快速。因为浏览器内置了 JS 的运行环境。所以无论走到哪里,无论是谁的电脑。只要有浏览器就可以运行 JS 代码。
脚本语言
脚本语言的优点有很多。跟编译型语言不同的是脚本语言是解释执行的。也就是脚本语言通常都有 REPL (Read, Eval, Print, Loop) 。
简单的说就是可以交互式编程。一边写一边运行。
平时写编译型语言都是很大一部分才能运行。而如果是脚本语言可以一句一句来写。快速的迭代,直到完成后,将所有代码复制到一个文件就写完了。
函数式编程
现在函数式的讨论很火热。许多语言纷纷加入对函数式编程的支持。
函数式编程最基本的一点是函数是第一公民(First Class)。
也就是函数跟其他类型,比如整数,在使用上可以很方便的定义,传递和返回。
有些语言不支持匿名函数,所以得先定义函数,在通过变量引用函数,通过传递这个变量才能传递函数。
有些语言不支持传递和返回函数,只能通过面向对象的方式模拟。
而在 JS 里全都支持。函数式编程在 JS 里很自然也很简单。
1 | // 定义匿名函数 |
当然还支持 柯理 化(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 | // 函数调用 |
既然跟 C 语言语法类似。那还要学习什么呢?
当然是学习一些不类似的情况。
最起码要能一次性答对 JS 常见问题吧
1 | []==[] |
也不是太难嘛(逃
可扩展
JS 最大的优点是可扩展。不爽可以写一个库啊。如果还不行那就写一个转译成 JS 的语言啊。
如果你觉得写语言太麻烦可以直接使用现成的。比如 CoffeeScript
1 | # 赋值: |
将转译成以下 JS
1 | var cubes, list, math, num, number, opposite, race, square, |
微软脑残粉还可以使用 M$ 山寨 JS 失败不死心后出的 Typescript
1 | // 官网访问太慢懒得贴代码了。 |
Typescript 加上了静态类型,把解释执行的语言搞得类似编译型语言一样。
觉得太死板?可以用颜文字来写 JS !
1 | ゚ω゚ノ= /`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゚]) (゚Θ゚)) ('_'); |
颜文字输入太麻烦?你可以只用 8 种字符写 JS !
1 | [][(![]+[])[!+[]+!![]+!![]]+([]+{})[+!![]]+(!![]+[])[+!![]]+(!![]+[])[+[]]][([]+{})[!+[]+!![]+!![]+!![]+!![]]+([]+{})[+!![]]+([][[]]+[])[+!![]]+(![]+[])[!+[]+!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[+!![]]+([][[]]+[])[+[]]+([]+{})[!+[]+!![]+!![]+!![]+!![]]+(!![]+[])[+[]]+([]+{})[+!![]]+(!![]+[])[+!![]]]((!![]+[])[+!![]]+([][[]]+[])[!+[]+!![]+!![]]+(!![]+[])[+[]]+([][[]]+[])[+[]]+(!![]+[])[+!![]]+([][[]]+[])[+!![]]+([]+{})[!+[]+!![]+!![]+!![]+!![]+!![]+!![]]+([][[]]+[])[+[]]+([][[]]+[])[+!![]]+([][[]]+[])[!+[]+!![]+!![]]+(![]+[])[!+[]+!![]+!![]]+([]+{})[!+[]+!![]+!![]+!![]+!![]]+(+{}+[])[+!![]]+([]+[][(![]+[])[!+[]+!![]+!![]]+([]+{})[+!![]]+(!![]+[])[+!![]]+(!![]+[])[+[]]][([]+{})[!+[]+!![]+!![]+!![]+!![]]+([]+{})[+!![]]+([][[]]+[])[+!![]]+(![]+[])[!+[]+!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[+!![]]+([][[]]+[])[+[]]+([]+{})[!+[]+!![]+!![]+!![]+!![]]+(!![]+[])[+[]]+([]+{})[+!![]]+(!![]+[])[+!![]]]((!![]+[])[+!![]]+([][[]]+[])[!+[]+!![]+!![]]+(!![]+[])[+[]]+([][[]]+[])[+[]]+(!![]+[])[+!![]]+([][[]]+[])[+!![]]+([]+{})[!+[]+!![]+!![]+!![]+!![]+!![]+!![]]+(![]+[])[!+[]+!![]]+([]+{})[+!![]]+([]+{})[!+[]+!![]+!![]+!![]+!![]]+(+{}+[])[+!![]]+(!![]+[])[+[]]+([][[]]+[])[!+[]+!![]+!![]+!![]+!![]]+([]+{})[+!![]]+([][[]]+[])[+!![]])())[!+[]+!![]+!![]]+([][[]]+[])[!+[]+!![]+!![]])()([][(![]+[])[!+[]+!![]+!![]]+([]+{})[+!![]]+(!![]+[])[+!![]]+(!![]+[])[+[]]][([]+{})[!+[]+!![]+!![]+!![]+!![]]+([]+{})[+!![]]+([][[]]+[])[+!![]]+(![]+[])[!+[]+!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[+!![]]+([][[]]+[])[+[]]+([]+{})[!+[]+!![]+!![]+!![]+!![]]+(!![]+[])[+[]]+([]+{})[+!![]]+(!![]+[])[+!![]]]((!![]+[])[+!![]]+([][[]]+[])[!+[]+!![]+!![]]+(!![]+[])[+[]]+([][[]]+[])[+[]]+(!![]+[])[+!![]]+([][[]]+[])[+!![]]+([]+{})[!+[]+!![]+!![]+!![]+!![]+!![]+!![]]+([][[]]+[])[!+[]+!![]+!![]]+(![]+[])[!+[]+!![]+!![]]+([]+{})[!+[]+!![]+!![]+!![]+!![]]+(+{}+[])[+!![]]+([]+[][(![]+[])[!+[]+!![]+!![]]+([]+{})[+!![]]+(!![]+[])[+!![]]+(!![]+[])[+[]]][([]+{})[!+[]+!![]+!![]+!![]+!![]]+([]+{})[+!![]]+([][[]]+[])[+!![]]+(![]+[])[!+[]+!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[+!![]]+([][[]]+[])[+[]]+([]+{})[!+[]+!![]+!![]+!![]+!![]]+(!![]+[])[+[]]+([]+{})[+!![]]+(!![]+[])[+!![]]]((!![]+[])[+!![]]+([][[]]+[])[!+[]+!![]+!![]]+(!![]+[])[+[]]+([][[]]+[])[+[]]+(!![]+[])[+!![]]+([][[]]+[])[+!![]]+([]+{})[!+[]+!![]+!![]+!![]+!![]+!![]+!![]]+(![]+[])[!+[]+!![]]+([]+{})[+!![]]+([]+{})[!+[]+!![]+!![]+!![]+!![]]+(+{}+[])[+!![]]+(!![]+[])[+[]]+([][[]]+[])[!+[]+!![]+!![]+!![]+!![]]+([]+{})[+!![]]+([][[]]+[])[+!![]])())[!+[]+!![]+!![]]+([][[]]+[])[!+[]+!![]+!![]])()(([]+{})[+[]])[+[]]+(!+[]+!![]+!![]+!![]+[])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+[]))+([][[]]+[])[!+[]+!![]+!![]]+(![]+[])[!+[]+!![]]+(![]+[])[!+[]+!![]]+([]+{})[+!![]] |
满意了吗?还有哪个语言能这么灵活满足各种奇奇怪怪的要求?
最后
本文仅用于调侃 JS 。并不是用于安利 JS 。请不要相信文中的任何一本正经的话。