24 April 2011

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的交互式终端里面使用“_”,你会发现诡异的问题,原因是这个终端默认使用“_”表示上一个命令的返回值。



blog comments powered by Disqus