基本
prompt
によって格納される値はstring型。
let value = prompt(); // なにか文字列を入れて「OK」を押す
console.log(typeof value === "string"); // -> 'true'
何も入れずに「OK」を押した場合も、string型の空欄として格納される。
let value = prompt(); // 何も入れずに「OK」を押す
console.log(value === ""); // -> 'true'
一方で、「キャンセル」ボタンまたはESCキーによってキャンセルされた場合はnullが入る。
let value = prompt(); // 「キャンセル」を押す
console.log(value === null); // -> 'true'
数値として扱う場合
数値として扱いたい場合は、文字列をいったん数値に変換する必要がある。
変換は+
(binary plus)を先頭につけるだけでいい。
let value = prompt(); // 数字を入力
let num = +value;
console.log(typeof num === "number"); // -> true
// 次のように、一行にまとめたほうがわかりやすいだろう
let value = +prompt();
しかし上記のようにすると、「空白が入力された場合」や「キャンセルされた場合」に0に変換されてしまう。
これは「空白文字やnullは数値に変換すると0になる」というJavaScriptの仕様。
そのため、もし空白やキャンセルの場合の挙動を変更したい場合は、あらかじめ分岐を作成する必要がある。
let value = prompt(); // 数字や空白を入力したり、キャンセルしたり
if (value === null) {
console.log("value is null");
} else if (value === "") {
console.log("value is empty");
} else {
console.log(+value);
}
NaNの対応
もし数値に変換できない文字列を変換した場合、JavaScriptはNaN(Not a Number)を返却する。
(上記のソースに"hoge"などを入れると確認ができる。)
そのため最後に変換した数値がNaNでないことを確かめるためにisFinite
を利用する。
このメソッドは、与えられた数値が有限値であるかを確かめるメソッドで、NaNに対してはfalseを返却する。
let value = prompt(); // 数字や空白を入力したり、キャンセルしたり、数値以外の文字列を入れたり
if (value === null) {
console.log("value is null");
} else if (value === "") {
console.log("value is empty");
} else if (!isFinite(value)) { // valueはメソッド内で数値に自動変換される
console.log("value is not a number");
} else {
console.log(+value);
}
結論
promptが実務で使われることは考えづらいが、テストなどで利用する場合は上記の例などに注意しよう。