質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

4回答

8274閲覧

JavaScript 変数の存在チェック is not defined の解決方法

pinoko

総合スコア127

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2018/11/05 07:05

編集2018/11/05 09:19

取得した値を元に、動的に変わる変数をtypeofで存在チェックをしているのですが、is not defined とエラー出力されてしまいます。
なにが間違っているのでしょうか?宜しくお願いします。

エラー内容
// ReferenceError: text5 is not defined

JavaScript

1var text1 = 'hoge1', 2 text2 = 'hoge2', 3 text3 = 'hoge3'; 4 5var getNum = 5; 6var setText = 'text' + getNum; 7 8if(typeof eval(setText) !== 'undefined'){ 9 console.log(eval(setText)); 10} else { 11 console.log('なし'); 12}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/11/05 07:16

エラーは要約したり省略したりせずにそのままコピペしてください。
pinoko

2018/11/05 07:24

ご回答ありがとうございます。エラー内容は text5 is not defined になります。
m.ts10806

2018/11/05 07:26

質問は編集できるので、この「質問への追記、修正の依頼」があったときには質問本文に追記して返してください。
m.ts10806

2018/11/05 07:37

ちなみにこれeval()いれる意味ないですよね。typeof setText だけで同じ結果(今回の場合、getNumに1~3を入れるとhoge1~3が表示される)
pinoko

2018/11/05 08:21

getNumで取得される値が必ずしも1~3ではないので、例えば5の値を取得した時、存在しない変数なら処理をしたいと思ったわけです。 eval()を入れないと式が評価されず、変数の確認が出来ないです。
guest

回答4

0

取得した値を元に、動的に変わる変数をtypeofで存在チェックをしているのですが

こんな回りくどいことをせずに、配列あるいはオブジェクトとしてtexts変数を用意して、texts[getNum]のように使うようにしましょう。evalは、可能な限り使うことを避けてください。

投稿2018/11/05 07:08

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pinoko

2018/11/05 09:01

ご回答ありがとうございます。 元のソースが変数宣言されていて、そこに固執してしまって配列にするという考えが出てきませんでした。 配列で書き直しましたのでその問題は解決しました。 ただし質問したエラーの原因がわからないのでクローズせずもう少し質問を仰ぎたいと思います。
guest

0

ベストアンサー

知りたいのは「理由」でしょうか。

なにが間違っているのでしょうか?宜しくお願いします。

typeof 未定義識別子 は確かにエラーを出しません。

しかし
typeof eval(未定義識別子) もエラーを出さないだろう、
というのは単なる思い込みで、

実際は、typeofより先に評価されるeval関数の中でエラーが発生してしまい
typeof にまで行かないで終わってしまう、ということでしょう。

===

例えば5の値を取得した時、存在しない変数なら処理をしたいと思ったわけです。
eval()を入れないと式が評価されず、変数の確認が出来ないです。

evalを使わないで済む方法を推奨しますし、具体例はほかの回答者さんのとおりです。

しかし、万が一、どうしても、文字列から変数の有無を確認をしたいのであれば、
先にtypeofより先にeval単体で検査すればよい、ということが、上記の理屈から分かることと思います。

javascript

1var text1 = 'hoge1', 2 text2 = 'hoge2', 3 text3 = 'hoge3'; 4 5var getNum = 5; 6var setText = 'text' + getNum; 7 8try{ 9 eval(setText); 10}catch(error) { 11 console.log("なし"); 12 setText=''; 13} 14 15console.log(eval(setText));

投稿2018/11/05 08:48

編集2018/11/05 11:37
taka-saan

総合スコア665

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pinoko

2018/11/05 09:53

ご回答ありがとうございます。 まさにこの回答です。 evalでエラーを出していた、なので変数存在チェックをと思いましたが、そのエラーの意味を履き違えていたということですね。 eval自体がエラーで、その際の確認にtry catchが必要だったということですか。 勉強になりました。ありがとうございます。
guest

0

エラーの原因は既出通りですが、try-catch を使用する必要はありません。

JavaScript

1console.log(typeof setText !== 'undefined' ? eval(setText) : 'なし');

Re: pinoko さん

投稿2018/11/05 11:12

think49

総合スコア18162

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taka-saan

2018/11/05 11:38

変数 setText には、'text5' という「変数名」が文字列で入っていて、 このとき 変数text5が未定義なのかどうかを判定したい、 という要件のようです。 すみません、私のコードがgetNum = 3になってます(ました)が、getNum = 5の時の話です。 修正しておきます。
think49

2018/11/05 12:08 編集

変数が未定義なら、typeof演算子は "undefined" を返しますので、そこで判定可能です。 undefined値とReferenceErrorを区別するなら使えませんが、String値が期待される変数にundefined値を定義済判定するメリットはないと判断しました。
guest

0

どうしてもというならこうですかね?

javascript

1var text1 = 'hoge1', 2 text2 = 'hoge2', 3 text3 = 'hoge3'; 4var getNum = 5; 5var setText=(typeof this["text"+getNum]!=="undefined")?this["text"+getNum]:"none"; 6console.log(setText);

投稿2018/11/05 07:53

yambejp

総合スコア114769

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pinoko

2018/11/05 08:26

ご回答ありがとうございます。 getNum = 2 でも none になってしまいます。 そもそもなぜ this["text"+getNum] の配列が登場するのかよくわからないです。 配列で作り直せばarray.indexOfで事足りるかと思いますが、ご提示頂いたソースは配列前提の話でしょうか?
yambejp

2018/11/05 08:32 編集

> getNum = 2 でも none になってしまいます。 chromeやfirefoxはちゃんとhoge2を返すみたいです 確認された環境はなんでしょうか? var text1 = 'hoge1', text2 = 'hoge2', text3 = 'hoge3'; for(var getNum = 1;getNum<=5;getNum++){ var setText=(typeof this["text"+getNum]!=="undefined")?this["text"+getNum]:"none"; console.log(setText); }
pinoko

2018/11/05 08:55

jqueryの$(function(){ この中 }); または window.onload=function(){}の中に記述していたので動きませんでした。 全てnone 環境はwindows Chrome最新、Firefox developer editionなどです。 普通に書けば動きました。 ただ、そうなるとなぜ上記の場合だと動かないのか意味不明です。 DOMを読み込んだあとに実行してもなんら問題ないと思いますがなぜなんでしょう。
yambejp

2018/11/05 09:04

> window.onload=function(){}の中 その場合はvarを指定しなければいけるのでは? window.addEventListener('DOMContentLoaded', function(e){ text1 = 'hoge1', text2 = 'hoge2', text3 = 'hoge3'; for(var getNum = 1;getNum<=5;getNum++){ var setText=(typeof this["text"+getNum]!=="undefined")?this["text"+getNum]:"none"; console.log(setText); } });
pinoko

2018/11/05 09:14

たしかに var を書かなければ大丈夫ですが、 ただし、“use strict”を使うと、変数の宣言をしていないわけなのでエラーになってしまいます。 そもそもなぜ var で宣言すると none になってしまうのかがわからないです…
yambejp

2018/11/05 09:24

> use strict”を使う そういうことなら、window.addEventListenerの外側で宣言してください 'use strict' var text1 = 'hoge1', text2 = 'hoge2', text3 = 'hoge3'; window.addEventListener('DOMContentLoaded', function(e){ for(var getNum = 1;getNum<=5;getNum++){ var setText=(typeof this["text"+getNum]!=="undefined")?this["text"+getNum]:"none"; console.log(setText); } });
pinoko

2018/11/05 09:40

いろいろありがとうございます。 スコープの問題でした。 1点だけ教えて欲しいですが、 text1~3まで普通の変数なわけですが、this["text"+getNum]で配列になってしまっているのですが、 これはどういう動きなんですか? これでどうして値が取れるのかがどうも理解出来ないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問