JavaScript の Uint8ClampedArray

JavaScript の型付き配列 (Typed Array) は要素の型毎に Int8Array、Uint16Array のような種類があります。

型付き配列の種類については「JavaScript の型付き配列の種類」をご覧ください。

その中に、 Uint8ClampedArray というタイプの型付き配列があります。

他の型は「要素の型名」+「Array(配列)」という名前です。しかし、Uint8ClampedArray だけ「Clamped」という文字があります。

ここでは Uint8ClampedArray の意味を説明し、サンプルコードで動作確認します。

Uint8Array でのオーバーフローの発生

「8ビット符号なし整数」の型付き配列としては、 Uint8Array があります。

「8ビット符号なし整数」ですから、 0 から 255 までの範囲の整数値を表すことができます。

let a1 = new Uint8Array(4)
a1[0] = 1
a1[1] = 2
a1[2] = 3
a1[3] = 4
console.log(a1)
// Uint8Array [ 1, 2, 3, 4 ]

しかし、8ビット符号なし整数の範囲外の数値をセットした場合には、オーバーフローが発生します。

let a1 = new Uint8Array(4)
a1[0] = -1
a1[1] = 0
a1[2] = 255
a1[3] = 256
console.log(a1)
// Uint8Array [ 255, 0, 255, 0 ]

このように -1 という数値を設定した箇所は 255 として認識され、 256 という数値を設定し箇所は 0 となります。

Uint8ClampedArray では、オーバーフロー発生時の動作が異なります。

クランプとは?

英語でクランプ (clamp) というと、次の絵のような留め具のことを指します。

クランプ

クランプで物を固定することも、動詞で「クランプする」という言い方をします。クランプで留められた状態は「クランプされた (clamped)」ということになります。

"Clamped (クランプされた)" 8ビット符号なし整数値の配列 (Array) では、0 から 255 の範囲に数値を抑えこみ固定する、という動作になります。

Uint8ClampedArray とは

Uint8ClampedArray では、「8ビット符号なし整数」の範囲 (つまり 0 から 255) を超えた数値を、 0 または 255 に置き直します。

0 より小さい値は 0 に置き換え、 255 より大きい数値は 255 に置き換えます。

クランプ

数値のビット表現に従って何もせずに数値のオーバーフローを発生させるのではなく、 Uint8ClampedArray では有効な数値の範囲に値を押さえ込むようになります。

次の例では -1256 などの、 8ビット符号なし整数値の範囲外の数値をセットしたときに、 Uint8ClampedArray でどのように値が格納されるか確認しています。

let a2 = new Uint8ClampedArray(4)
a2[0] = -1
a2[1] = 0
a2[2] = 255
a2[3] = 256
console.log(a2)
// Uint8ClampedArray [ 0, 0, 255, 255 ]

Uint8ClampedArray ではオーバーフローせずに、最寄りの範囲内の値としてセットされていることが確認できます。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 JavaScript 入門