暗黙の型変換、いったい何者なんだ…
と田舎で育った曇りなき純朴な好青年である私がJavaScriptの恐怖の暗黙の型変換に怯えていたところ、プログラマ界隈で容赦なく他人にマサカリをなげつけることで有名な方々からめんどくさいありがたい助言を頂いたので色々調べてみることにしました。なお、以下の言語選択に何ら恣意的なモノは無く、普段よく使う言語を並べただけです。いや、ホント、偶然の選択だよ!
JavaScript
1 + '1' > 11 //なるほど、数値と文字列で計算すると文字列に変換されるのね 3 * '3' > 9 //えっ! (1+2)+'3' > '33' 1+(2+'3') > '123' //結合法則とは何だったのか… 1 + true > 2 //やばい…どうしてこうなった… true == 1 > true //ふむふむ、どうやら==で確認してみるとtrueと1は同じか。さすがにtrue === 1はfalseだけど "AA" + 1 > 'AA1' "AA" + true > 'AAtrue' //'AA1'じゃないのかよ!!
HSP
mes 1+"1" > 2; //えっ mes "1"+1 > 11; //なるほど、最初の項に型を合わせてるのかな? mes 1+"1A" > 2; //えっ mes 1+"A1" > 1; //ええっ mes 1+"1" > 1; //えええっ
Excelシート
=1+"1" > 2; ="1"+1 > 2; ="1"+"1" > 2; //えええええ、マジで!? ="a1"+1 > error;
VBA
MsgBox ("1" + 1) > 2; MsgBox (1 + "1") > 2; MsgBox ("1" + "1") > "11";えええええ、同じことしてもExcelシートと結果が違うんだ! MsgBox (1 + "A1") > error;
awk*1
>awk "BEGIN{ print "1"+1; >2 print 1+"1"; >2 print "1"+"1"; >2 //awkもかっ!! print "1a"+1; >11 //えっ print "a1"+1; >1 //えっ print "1a"+"1"; >11 //えっ、"1a1"じゃないの… print ""+"1"; >error //えっ、なんでエラーなの、"1"じゃないの… print ""+1; >error //えっ、なんでエラーなの、"1"でも1でもないの… print "1a"+"a"; >10 //えっ print "a"+"a"; >0 //なるほど、+は数値に強制変換するのかな? print 1; >1 print 01; >1 print 10; >10 print 010; >8 //8進数として処理 print "010"; >8 //えっ、えっ、えっ、マジで… }"
感想
awkに関する追記*2
@houmeiさんからこのようなご指摘を頂戴いたしました。
https://twitter.com/houmei/status/292668690787336193
https://twitter.com/houmei/status/292669890911948800
で、私の上記の結果は1ライナーで実行したものです。そこでhoumeiさんと同じくスクリプトにして実行してみたところ、
http://ideone.com/E7zfcS
というような結果になりました。
えっえっえっ、どういうこと、1ライナーでの結果とスクリプト実行した時の結果って違うの?マジで…?と思ってたら
https://twitter.com/houmei/status/292672197611384835
ということだったそうです。
また、@finalfusionさんから
https://twitter.com/finalfusion/status/292679245812097024
というご指摘も頂きました。そーいやPHPで文字列を+で連結しようとしてしまって面倒くさいことになったのを思い出しました。
言われてみればそりゃそーだって感じなのですが、素でうっかりして実際の業務でも同じことしでかしそうだなと思ったので、あえて恥を晒し続けることにします。
ご指摘ありがとうございました!
追記の追記
4/9にPythonとJavaScriptの暗黙の型変換ネタを教えて頂いたので追加しました。
追記の追記の追記
面白いの紹介して頂いたので追記。
JavaScriptクイズ「x + 0 == x - 0」