作者: ねこ丸
日時: 2009/2/3(15:54)
  ねこ丸です。

# 久しぶりにこの文字を書いたな。

davi writes:

> > defaultになってしまう理由は、case文の値が引用符で囲まれてない
> > からです。
> 
> case "Leaf000"
> 
> みたいにしたら、バッチリでした。
> む〜ん。""で一晩か…。結構大切なのねぇ。
> 
> http://homepage2.nifty.com/yoshi-m/makehp/javascript/reference/meirei/11.htm
> に「数値が入る」とありますが、便宜的な説明としてそうしているだけなのか。
> ホントに文字列を与えるのは仕様的にはNGなんでしょうかね。

  二つの問題が含まれています。

  伝統的で教科書的な C プログラムでは switch - case に数値を使う場合が
多いです。その名残りの形だけを鵜呑みにして「数字が入る」と断定しちゃっ
てるのかもしれません。ただ、動かしもせずにサンプルコード付きで断定する
態度は感心しませんが。

  もう一つは、プログラミング言語における文字列の扱いです。JavaScript に
限らず、多くの言語において数値と文字は同じ書き方ができません。文字は '
や " で囲むのがセオリーであり、JavaScript もそれに従っています。つまり、
文字列と比較したければ、その比較対象の文字列は「当然」 ' や " で囲まれ
ている必要があります。

  ポイントはここでしょうね、「文字列を書いているのに ' や " で囲んでい
ないのはおかしいんじゃないか?」と感じるかどうか。


> case 001 :
> 
> とやったときに、valueやidが文字列 001 ではなくeval(001)の
> 結果と同様に、数値1として扱われるブラウザの実装挙動もアリ
> かもしれんのか?という疑問。

  たぶんですけど HTML の中の情報は全部文字列じゃないですかね。DOM 自体
にはどの属性がどういう値を持ち得るかという意味の情報はなかったような。
length などのプロパティは当然数値になりますが、特定の属性は数値しか持た
ないので自動的に数値として返す、みたいな親切な作りにはなってないと思い
ます。

  ただそこは実はあまり心配する必要はなくて、数値と数字は相互に自動変換
されます。

  SpiderMonkey という Firefox の JavaScript エンジン(もう変わるんでし
たっけ?)だけをコマンドラインで動かすとこんな動作が確認できます。

 js> print ("1" == 1);
 true

  当然、何がきても true になるわけではなくて、

 js> print ("2" == 1); 
 false

  2 と 1 は違うよ、と当たり前のことを言ってくれます。上の例だと

 js> print ("001" == 001);
 true

  です。ただし、数値の頭に 0 を付けると 8進数になるので、無意識に 0 を
付けるのはかなり危険です。

 js> 010;       
 8

  これも、かなり多くの言語で同じ動作をします。数値の頭に 0 を付けると
8 進数になってしまいます。

# 現実逃避にこのために SpiderMonkey を入れました :)

--
    ねこ丸