2015年7月28日火曜日

[javascript] 配列の引数の実数を渡してはいけない

当たり前のことなのかもしれないが、少しはまったのでメモ。
JavaScriptのインデックスを指定するとき、 インデックスのもとになる値が実数値の場合、 Java の習慣でそのまま整数値に切り捨てられるつもりでいた。
  var anArray = new Array(10);
...
  anArray[Math.random() * 10] += 1;
...
上記のコードは期待通りに動かない。
Math.random() * 10 を Math.floor() で整数化しておく必要がある。


動作を確認してみる


インデックスに実数値を指定して、実際の動作を確認してみる。
<html>
<p id="output"></p>
<script>
  var anArray = new Array(2);
  anArray[0]= 100;
  anArray[1]= 200;
  anArray[0.5] = 50;
  
  var result = "";
  result =  "anArray[0] = " + anArray[0] + "<br>" 
         + "anArray[1] = " + anArray[1] + "<br>"
         + "anArray[0.5] = " + anArray[0.5] + "<br>"
         + "anArray.length = " + anArray.length + "<br>";

  document.getElementById("output").innerHTML = result;
</script>
</html>
※ <br> が全角なのは Syntax Highlighter が誤解釈してしまうため

この実行結果は以下のようになる。

anArray[0] = 100
anArray[1] = 200
anArray[0.5] = 50
anArray.length = 2
 
インデックスに実数を指定してセットした値はそのまま、 Array オブジェクトのプロパティとして登録されてしまう。
JavaScript で Array に値を格納する際には、 必ずインデックス値を整数化してから登録する必要がある。

もともとは、Google Apps Script ではまったのだが、 この挙動は JavaScript に起因しているものだった。

0 件のコメント:

コメントを投稿