ここから本文です

jsで文字列を使って変数を参照するのはどう書けばいいのでしょうか?

mob********さん

2020/6/2710:39:45

jsで文字列を使って変数を参照するのはどう書けばいいのでしょうか?

const HOGE= 'foo';
let ref = 'HOGE';

console.log(`${ref}`);

このように書いても中身が空になります。

閲覧数:
15
回答数:
2

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

oishii_mahouさん

2020/6/2713:11:11

まず、
質問のコードでは、
変数 ref に "HOGE" という文字列が代入されているから、
中身は空にはならない。"HOGE" になる。


文字列として与えられた変数名に相当する変数を参照したいなら、
eval() を使えばいいだけ。

────────────────
const HOGE= 'foo';
let ref = eval( 'HOGE' );
console.log( `${ ref }` );
────────────────

ただし、
eval() はスクリプトの安全上、
できる限り使用しないようにずっと昔から警告されている
非推奨のメソッド。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Glob...

通常であれば、

────────────────
const HOGE= 'foo';
let ref = HOGE;
console.log( `${ ref }` );
────────────────

のように、
ふつうに変数を参照すれば済むものを、
なぜ、
変数名を文字列で指定して参照しないといけないような
おかしな状況になっているのか分からんけど、
文字列として参照しなくても済む方法で実装した方がいい。

変数を、
オブジェクトのプロパティとして定義しておけば、

────────────────
const obj = new Object();
obj.HOGE = 'foo';
let ref = obj[ 'HOGE' ];
console.log( `${ ref }` );
────────────────

のように、
eval() を使わなくてもプロパティ名を文字列で扱うこともできるし、

────────────────
var HOGE= 'foo';
let ref = window[ 'HOGE' ];
console.log( `${ ref }` );
────────────────

のように、
const ではなく var で定義されたグローバル変数であれば、
window オブジェクトのプロパティとして文字列で扱える。

実際の用途が何も示されていないんで具体的な方法は示せないが、
それ以外の場合でも、
処理全体のしくみを見直せば、
変数名を文字列で参照しなくてもいい方法が必ずあるはず。

質問した人からのコメント

2020/7/4 10:56:26

皆さんお答えありがとうございます。
文字列から変数名を参照する使い方はあまりしない方がいいのですね。
文字列から変数名を参照するやり方を変えるようにやってみます。

ベストアンサー以外の回答

1〜1件/1件中

プロフィール画像

カテゴリマスター

siiさん

2020/6/2713:13:19

--------------------
var HOGE = 'foo'
const ref = 'HOGE'
console.log(window[ref])
--------------------

varだとこのように、グローバル変数にグローバルオブジェクトのプロパティとしてアクセスする方法が使えます(Node.jsは除く)が、constだとダメなので、

--------------------
var HOGE = 'foo'
const ref = 'HOGE'
console.log(eval(ref))
--------------------

evalしか無いかなぁと思います。

console.log(new Function('return ' + ref)())

こういうのもありますが、evalとやっていることは同じです。

あわせて知りたい

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる