javascript(クライアント側)とperl(サーバ側)で、JSONデータやり取りする。
…というコードを、一人で同時に書いている時に、うっかり間違えたのでメモ。
Javascriptで、文字列の "0"
は true
だ。
javascript
var num = 0; // これは false
var str = "0"; // こっちは true
var emp = ""; // 文字列で言うなら、これが false
var undf; // 未定義も当然 false
// 文字の "0" をifに放り込むと
if (str) {
print "これが通る。";
}
// このケースが勘違いの元。
// 勝手にキャストされる。
if (str == 0) {
print "文字列 str と数値の 0 が一致";
}
// こうすれば通らない
if (str === 0) {
}
else {
print "===は型まで見るから一致しない";
}
// 空文字については
if (emp == 0) {
print "数字の0と一致するのが面白い";
}
if (emp == "0") {
}
else {
print "当然、空文字と文字の0は一致しない";
}
// 未定義値は何とも一致しない
if (undf == 0) {
}
else {
print "undefindは0ではない";
}
if (undf == "") {
}
else {
print "undefindは空文字とも違う";
}
一方、perlだと以下のようになる。
変数の型じゃなく、使う演算子で判断してる。
perl
my $num = 0; # これは false
my $str = "0"; # これも false、0っぽいから。
my $emp = ""; # これももちろん false だし
my $undf; # 当然 false
# 文字の "0" をifに放り込むとfalse。
if ($str) {
}
else {
print "0っぽいからfalse";
}
# 演算子を見て良きにはからってくれる。
if ($str == 0) {
print "数値比較した結果、文字の0は数値の0と一致";
}
if ($num eq '0') {
print "文字比較した結果、数値の0と文字の0が一致";
}
# 空文字についても同様。
if ($emp == 0) {
print "空文字ってことは数値で言えば0";
}
if ($emp eq "0") {
}
else {
print "でも文字で言えば、0とは違う";
}
# 未定義とかも、あんまり考えなくていい。
if ($undf == 0) {
print "値がない、ということは、数値で表せば0";
}
if ($undf eq "") {
print "文字で言えば空文字";
}
# わざわざ未定義を判別したいこととかある?
if (!defined($undf)) {
print "どうしてもと言うなら、defined()で";
}
雑談
perlはそもそも変数に型とか無い。
型制限したいなら、そのように書く方法もあるけど、デフォルトはなし。
perl式の気の利き方に慣れると、コーディングがやたら快適だけど、特殊なんだろうなとは思う。
javascriptは、いっそ勝手にキャストしたりしないでくれたら、最初からそのつもりで書くのに。
それはそれでやっぱり面倒くさいから、現状のようになってるのかなぁ。