tkawachi Blog

underscore.js in Node REPL

underscore.js の挙動を試そうと node をインタラクティブに起動して以下のように試したところ _ が配列で置き換えられてしまう。

$ node
> var _ = require('underscore');
> _([1,2,3,2,1]).uniq();
[ 1, 2, 3 ]
> _
[ 1, 2, 3 ]

なぜ?どうして? しばらく悩んじゃいました。

あれこれやっているうちに、以下のように console.log() で結果をだすと問題ないことがわかった。

$ node
> var _ = require('underscore');
> console.log(_([1,2,3,2,1]).uniq());
[ 1, 2, 3 ]
> _
{ [Function]
  _: [Circular],
  VERSION: '1.2.3',
(略)

正解はこれ

The special variable _ (underscore) contains the result of the last expression.

気づいてしまえばなんてこと無いです。 node の REPL (Read-Eval-Print-Loop) が最後の式の値を自動的に _ に代入するとのこと。

一つ解せないのは expression の評価値が undefined の場合には _ に代入されないこと。 Node v0.4.7 で確認しました。最新版でどうなっているかは知りません。

$ node
> 1
1
> _
1
> undefined
> _
1

まあこの挙動のおかげで console.log()_ が置き換えられなかったわけですけどね。

Comments