0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

promptで格納されるデータの扱い方

Last updated at Posted at 2019-01-19

基本

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が実務で使われることは考えづらいが、テストなどで利用する場合は上記の例などに注意しよう。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?