読者です 読者をやめる 読者になる 読者になる

node-merge-recursiveとlodashのコードを読んだ結果

Node.js JavaScript

先日の記事で「node-merge-recursiveを使うと,Dateオブジェクトがコピーできない」ということを見つけたのでその原因を調べてみた.

両者ともオブジェクトがネストしていた場合は,再帰を用いているのは変わらない.違っていたのはそのオブジェクトの判別であった.

node-merge-recursiveの場合

こちらの場合はネストしたものがオブジェクトかどうかの判別に

typeof value == 'object'

を用いていた.

https://github.com/UmbraEngineering/node-merge-recursive/blob/master/lib/index.js#L48-L50

これだと連想配列としてのオブジェクトもDateオブジェクトも同様にobjectとなってしまい,どちらの場合も再帰をしていたため予期しない挙動となってしまっていた.

typeof {title: "ゆゆ式", tag: ["poem", "ゆゆ式"]}
=>'object'

typeof new Date
=>'object'

lodashの場合

それに対してlodashの場合はネストしているオブジェクトのオブジェクトクラスを見て再帰するかどうかを判別していた.

toString.call({title: "ゆゆ式", tag: ["poem", "ゆゆ式"]}
=>'[object Object]'

toString.call(new Date)
=>'[object Date]'

https://github.com/lodash/lodash/blob/master/dist/lodash.js#L6936

所感

とりあえず自分の中でうまく動かない理由を見つけられたので満足している. node-merge-recursiveのほうで,オブジェクトクラスによる条件判別をしてDateクラスがあってもちゃんと動作するようなコードを書いたのだけど2年前から特にコミットもされてないようだしPRしなくてもいいかな,という気持ちになっている.lodash使おう.

ただRubyKaigiに参加した影響でOSSに貢献したいなーという気持ちと,リーダブルコード勉強会に参加後の他の人のコードやコミットを積極的に読む習慣をなんとかして形にしたいなーという想いはかなりある.

あとlodash.js,9600行くらいあって多分4月くらいの僕だったらファイル開いたあたりで諦めてる気がする.長めのコードを読む時に抵抗がなくなったのはバイトでずっとにコードに触れてるおかげかなーとか考えてる.

もし見当違いなことを言っていたら@alitaso345に教えて頂けると助かります.