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

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

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

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

Q&A

解決済

3回答

748閲覧

evalで連結作成した動的変数の存在判断

Yasu0421

総合スコア37

JavaScript

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

0グッド

0クリップ

投稿2018/06/06 01:53

毎度お世話になっております。
例えば、以下の様にevalを用いて動的に作成した変数があるとします

Javascript

1for(var i=0; i<5; i++){ 2 eval("var test"+i+"=" i*10); 3}

この言わば動的?に作成した変数 test0~test4は上記で初期化されているので
存在しますが、上記以外の例えば test5は存在していませんのでundefinedと
なります。
この存在判断を行うために例えば

Javascript

1for(var j=0; j<6; j++){ 2 if(typeof("test"+j) === "undefined"){ 3 aleart("test"+j+"undefined")4 ) 5}

等としても、上記の判断には合致することなく、test5はalertと出しません。

上記のような連結して作成した変数の存在判断を行うには
どのように対処したらよいのでしょうか?
ご教示いただければ幸いです。

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

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

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

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

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

guest

回答3

0

本題ではありませんが、'use strict';とした環境、あるいは自動でstrictとなる環境(モジュール内、class内など)では、evalで変数を外部に作ることができませんMDN)。

すでに述べたように、自動でstrictとなる環境も多くあるような状況なので、もはや非strictでしか動かないevalの挙動に頼るようなコードは、書くべきではないかもしれません。

投稿2018/06/06 02:18

maisumakun

総合スコア145184

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

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

Yasu0421

2018/06/06 02:25

いつもご回答いただきありがとうございます。 多角的な面からもご指摘いただき大変たすかります。 しばしば、”evalは使うべきでない”と記載された記事も見かけますが、 上記の観点が本質にあるのですね。 ご助言いただきありがとうございます。
maisumakun

2018/06/06 02:29

evalの問題点としては、 * 変数名で変数を参照、(最悪は書き込み)する必要が出てくるので、最適化が効かず遅くなる * 外侮から値を投げ込まれると、思わぬコードが実行されてセキュリティリスクとなる などがあります。そして、「ローカル変数の名前」なんていうものは、関数の外からは誰も知る余地もない、作業用の符号でしかないものですので、「名前ごと生成して処理させる」こと自体、通常は必要になりません。
Yasu0421

2018/06/06 02:34

詳細なご説明ありがとうございました。 他の手段についても検討してみるきっかけともなりました。 ありがとうございました。
guest

0

ベストアンサー

typeof("test"+j)は"string"なので、alertがでることはないですね。

testを宣言したコンテクストに対して、チェックする感じですかね。
たとえば、ブラウザでこれだけやってるとしたら、typeof(window["test"+j])とするとか。

なぜこのようなことをするのかが分かりませんが、配列とかobject(連想配列)を使うとかしたほうがいいように思えます(test[i]とか)。

投稿2018/06/06 02:10

papinianus

総合スコア12705

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

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

Yasu0421

2018/06/06 02:17

ご回答ありがとうございます。 ご提案いただいた内容で確認してみます。 evalを使う理由ですが、質問させていただいた例では簡素化するために "test+i"といった表現を使用させていただきました。 本来は、配列的ではなく、他の変数との組み合わせで生成された動的な 変数となります。(説明が下手で申し訳ございませんがつたわりましたでしょうか?) まずはお礼まで
mpyw

2018/06/06 02:18

PHPなら get_defined_vars のように現在のコンテキストに存在する変数をすべて収集する機能があるので頑張れなくはないですが,JavaScript にはそれがないため window を使ってグローバル変数を使う手段のみになってしまいますね。できるだけグローバル変数を使うのは避けたいですね。私も配列やオブジェクトを使う方法を支持します。何か質問者さんは目的に対して手段を間違えているような気がします…
mpyw

2018/06/06 02:21 編集

>> 他の変数との組み合わせで生成された動的な変数となります。 たぶんここがそもそも手段の選択ミスなような… 質問は具体的に書くべきとは言われますが,今回の場合具体的すぎて手段が完全にロックされてしまっているように見えるので,もう少し抽象的に,上位の目的を書いていただけると理想的な回答ができるかもしれません。
Yasu0421

2018/06/06 02:30

いろいろとご指摘いただきありがとうございました。 目的へたどり着くまでの手段・・・浅識な私にはまだまだ難しいですね 勉強致します。 で、結果としては、上手くいきました。 大変たすかります。 手段に関してももう少し深堀してみます。 有難うございました。
guest

0

他の方もおっしゃっていますが、
eval関数 そもそもはあまり使わない方がいいものだと思いますし、
配列やオブジェクトでも十分やりたいことはできるはずです。

それでもどうしても

for(var i=0; i<5; i++){ eval("var test"+i+"=" i*10); }

この形を貫きたいのであれば、判定でもevalを使えばいいではないかと。。。

javascript

1for(var j=0; j<6; j++){ 2 if(typeof(eval("test"+j)) === "undefined"){ 3 alert("test"+j+"undefined")4 ) 5}

しつこいようですが、おすすめはできない方法ですよ・・?

投稿2018/06/06 02:27

編集2018/06/06 02:28
mix-peach

総合スコア1910

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

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

Yasu0421

2018/06/06 02:41

ご回答いただきありがとうございます。 eval使用の件、心に響きました・・・ で、判定でevalを使うのは既にトライしていたのですが、evalからエラーが帰ってきてしまい(例えばtest1 not definedなど)判定できませんでした。難しいですね。
mix-peach

2018/06/06 03:00

なるほど。undefinedのものは、evalで実行時にエラーが出るんですね・・!試さずご提案すみません。それなら、 if(eval("typeof(test"+j+")") === "undefined"){ こうでしたね^^;
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問