Panda Noir

JavaScript の限界を究めるブログです。

Node.jsの対話モードが書いてない処理を挟んでくる

といってもふつうにしている分には困ることがあまりないであろう処理なので、気にしなくてもいい気はします。

再現コード

const proxy = new Proxy({res: []}, {
    get: (target, name, r) => {
        if (target[name]) return target[name];
        target.res.push(name);
        return r;
    }
});
proxy.hoge.fuga

これを対話モードで入力してみると、次の画像のようになります。

f:id:panda_noir:20170704102645p:plain

proxy.resには [“hoge”, “fuga”]になってほしいのに、 Symbol(util.inspect.custom)とSymbol(Symbol.toStringTag)という余計なものが加わっています。

なぜ余計なものが挟まったのか

しらべたところ、どうやらこの二つはproxy自身を表示するために呼び出されるメソッドのようです。

  1. proxy.hoge.fugaの返り値はproxy自身である
  2. Nodeの対話モードは評価した値を表示する機能がある
  3. 評価した値を表示するときに先の2つが呼び出される

こうなっているようです。

Proxyを使うような処理をしないかぎり問題は起きないと思います。また、そもそも対話モードは使い捨てのコードを書くのがメインなので、大した問題にはならないと思います。しかし、知らないとややビックリする仕様ではありますよね。