LoginSignup
2
0

More than 5 years have passed since last update.

数値の0、文字の"0"は true か false か。未定義値は何と一致するか。javascript と perl。

Last updated at Posted at 2019-02-04

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は、いっそ勝手にキャストしたりしないでくれたら、最初からそのつもりで書くのに。
それはそれでやっぱり面倒くさいから、現状のようになってるのかなぁ。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0