eval関数の是非はともかく、そのコードがエラーになるのは「配列の文字列化」の処理内容があなたの想定と異なるからです。
生成した文字列を直接evalせず、一度変数に代入して中身をチェックすればなぜエラーになるか容易に分かります。そのようなチェックの手間を惜しんではいけません。
"y:" + value_num[i] + ","
ここで、value_num[i]
を文字列として出力しています。これは value_num[i].toString()
が暗黙に呼び出されます。
Array.toString()は「配列の中身を単純にカンマで区切った内容」が出力されます。ドキュメントにちゃんと明示されています。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/toString
配列を表現する[
]
はtoString()では出力されません。
それでは解決方法はどうなのかというと、JSON.stringify
メソッドを通すとJSONで扱うような表現で文字列が出力されます。 JSON.stringify(value_num[i])
の出力結果を確認しましょう。
まあ、とにかくevalする前に一度変数に代入し、内容をチェックするのが確実です。
(大切なので2回言いました)
おそらく、じゃあconsole.log
で出てくる文字列は何なんだ、という疑問がわいてくると思います。私も内部の細かな挙動は詳しくないですが、console.logの内部で同じようにJSON.Stringifyが呼ばれているのであろうと思われます。
(違ってたら申し訳ない)
検証コード:
javascript
1var value_num = [[0,1],[1,2]];
2console.log("console.log(value_num[0]): ",value_num[0]);
3console.log("console.log(value_num[0].toString()): ",value_num[0].toString());
4console.log("console.log(JSON.stringify(value_num[0])): ",JSON.stringify(value_num[0]));
5var i = 0;
6
7var evalStr1 = "var val_" + i + "={" + "x:" + i + "," + "y:" + value_num[i] + "," + "};"; // これは不正な構文になる
8i++;
9evalStr2 = "var val_" + i + "={" + "x:" + i + "," + "y:" + JSON.stringify(value_num[i]) + "," + "};"; // これは正常な構文になる
10
11console.log("evalStr1: ", evalStr1);
12console.log("evalStr2: ", evalStr2);
13
14//eval(evalStr1);
15eval(evalStr2);
16
17//console.log(val_0);
18console.log(val_1);
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/05/25 17:10