スクリプトのコマンドライン引数にタブを渡す

Node.jsとかRubyとかPythonスクリプトコマンドライン引数を受け取る時、引数にタブ文字を指定する方法

var a = process.argv[2];
console.log([1,2,3].join(a));

実行

> node hoge.js \t
1t2t3
> node hoge.js '\t'
1\t2\t3

正解は

> node hoge.js $'\t'
1   2   3

改行コードなら

> node hoge.js $'\n'
1
2
3

JavaScriptの型変換に今更刺し殺される

ある日デバッガを見ていたらこんな文字列が目に入った

Mon Feb 13 2017 18:55:53 GMT+0900 (JST)1000

ナニコレ…?

ソース見たらこんな風になっていた

var now = new Date();
var startTime = now - 1000;
var endTime = now + 1000;

Dateオブジェクトに数値を足し引きしようとしている?!

ていうか、このコード、よく今まで問題なく動いてたなwww

> new Date() + 1000
'Mon Feb 13 2017 19:02:18 GMT+0900 (JST)1000'
> new Date() - 1000
1486980143743

Dateに引き算すると数値型に変換されてエポックになる。これは意図通りだが、足し算すると文字列型に変換されるわけですか、足そうとしているのが数値でもか。であれば

> +new Date() + 1000
1486980570179

ついでなので他のオブジェクトも見てみますかw

> [] + 1000
'1000'
> [] - 1000
-1000
> [1,2,3] + 1000
'1,2,31000'
> [1,2,3] - 1000
NaN

空の配列を数値に型変換すると 0 、文字列に型変換すると空文字列。空でない配列を数値に型変換するとNaNになるあたり勘弁してほしい。

> {} + 1000
1000
> {} - 1000
-1000

ん?

> new Object() - 1000
NaN
> new Object() + 1000
'[object Object]1000'

んん?

もしかして {} はオブジェクトではなくブロックとして扱われているのか? ならば

> ({}) - 1000
NaN
> ({}) + 1000
'[object Object]1000'

もうやだこれwww

> Object.create({}, {toString: {value: function(){ return 'くそ' }}}) + 1000
'くそ1000'

こういう挙動を個別に覚えなくてもいいようなコーディングを心がけたいところ。だーけーど、それならば静的型付け言語の方がいいのでは…、という話になっちゃうんすよね。