先日、
JavaScriptなコードのデバッグとかしてる際に、
ちょっとハマったことがあったので書いてみます。

 TypedArrayな配列に対して範囲外なインデクスで参照してしまい、
原因を見つけるのにちょっと苦労しました(^_^;)
TypedArrayは固定長になるので、
範囲外アクセスはてっきり例外が起きるものと・・・。

 ところで、
JavaScriptにおいて配列の中身を走査する場合、
for文で回すようなことはせず、forEach とかを使うと思います。
その方が便利だし安全だからです。

 なので、
そもそもコードの作りがまずいんじゃね?
というツッコミはごもっともですが、
そうせざるを得ない事情があったんです(^_^;)

 気になったので調べてみると、
こちらを見つけました。
現状では例外を起こさないことになっているそうです。
なんと! 知りませんでした(^_^;)

 具体例が載っていたので、
以下にそのまま引用します。
範囲外で書き込んだのは無かったことになっています。
ちなみに範囲外のを読み込むと 当然ながら undefined になります。

>> var uint16 = new Uint16Array(2);
>> uint16[0] = 42;
>> uint16[1] = 32;
>> uint16[2] = 12;
>> uint16
Uint16Array(2) [42, 32]

 普通の配列で同じことをやると、
配列は自動で伸長され、書き込みは有効になります。

>> var arr = new Array(2);
>> arr[0] = 42;
>> arr[1] = 32;
>> arr[2] = 12;
>> arr
(3) [42, 32, 12]

 ということで、今回の教訓(^_^;)

『TypedArrayをfor文とかで直にインデクス参照するような場合は、
範囲外アクセスしないように注意せよ!』

もちろん、
普通の配列でも同様に注意ですね。
まぁ、できるだけ直にインデクス参照しないようにすれば良いのですけど。

コメントする

メールアドレスが公開されることはありません。が付いている欄は必須項目です。