javascript确确实实是一个functional的语言,但问题是它本身并没有提供什么方便使用的库。不过还好我们有社区,有无数英雄们默默无闻地做贡献(眼泪花花儿的)。
介绍一下underscore。点过去看看就知道了,亲切得很。
安装很简单,直接npm就行了。不知道npm是什么的,或者google,或者参考这里。
虽然那里有无数的例子,但这里还是给一个吧:
1 2 3 4 5 6 7 8 9 10 11 12 13 | var loginInfo = function () { var info = [ ['tz_offset', '480'], ['username', 'xxx'], ['password', 'yyy'], ['realm', 'Zoning'] ]; var _ = require('underscore'); return _(info).map(function (item) { return item[] + '=' + item[1]; }).join('&'); }; |
“_(info)”返回一个对象,包含一个名叫_wrapped的property。
> var _ = require('underscore'); > var w = _([1, 2, 3]); > w { _wrapped: [ 1, 2, 3 ] }
有了这个东西之后一切都变得美好了,跟所有functional的用法一样,点啊点得就干了很多事儿。不过需要注意的是_(info).map()之后返回的东西就是一个数组了。嗯,不太好……
这个问题人家早就考虑过了:
1 2 3 4 5 6 7 8 9 10 11 12 13 | var loginInfo = function () { var info = [ ['tz_offset', '480'], ['username', 'xxx'], ['password', 'yyy'], ['realm', 'Zoning'] ]; var _ = require('underscore'); return _(info).chain().map(function (item) { return item[] + '=' + item[1]; }).join('&').value(); }; |
先chain一下,玩儿完之后再value一把。这回爽了吧?
顺便说一下,functional这么好的东西为什么会有人跳出来反对呢?
再多废一句话啊。如果你在node的交互式终端里面使用“_”,你会发现诡异的问题,原因是这个终端默认使用“_”表示上一个命令的返回值。