「JavaScript/Global」の版間の差分

削除された内容 追加された内容
U14269 (トーク | 投稿記録)
M U14269 がページ「JavaScript/標準ライブラリ/Global」を「JavaScript/Global」に移動しました
Ef3 (トーク | 投稿記録)
→‎eval(x): {{コラム|JSONオブジェクト}}
10 行
そのため
 
<syntaxhighlight lang="javascript">
<nowiki>
var v=eval('100'); // 数字型の100をvに代入 </nowiki>
</syntaxhighlight>
 
などとすると、その結果が返ってくる。
このことから、何らかのユーザーの入力があったときに、その結果をJavaScriptで扱うことができる状態に変換可能である。
例えば、次のコードはHTMLで作成した、選択ボックスの結果を、evalでJavaScriptに変換した結果を逐次代入している。
<syntaxhighlight lang="html5">
<nowiki>
<form id="enquete">
<select id="yes-no">
28 ⟶ 29行目:
ret = eval(this[this.selectedIndex].value);
}
</script> </nowiki>
</syntaxhighlight>
 
(ただし入力紹介する結果が数値である場合は、後で紹介するparseIntやparseFloatの方が安全である)
 
さらに一歩推し進めて考えると、次の様に、計算式等もeval関数は処理をして、変数を呼び出す事も出来る。
<syntaxhighlight lang="javascript">
<nowiki>
document.write( eval('100+100'), '<br />' ); // 200を表示
var s='Hello';
eval('s +=",World!"');
document.write( s, '<br />' ); // Hello,World!を表示 </nowiki>
</syntaxhighlight>
 
ちなみにevalで呼び出せる変数の値は、グローバル変数(何処の関数のスコープにも属していない変数; 実体はグローバルオブジェクトのプロパティ)で無ければならないのを知っておくべきである。
 
ここまでを知っていると、eval関数はまた新たな使い道を考えることが出来る。
外部から取り出したテキストを評価して、データとして取り出す手法である。
<syntaxhighlight lang="javascript">
<nowiki>
var s = '{ "住所":"東京都", "年齢":28, "性別":"男" }'; // 仮に外部から取り出したとしたデータ
var o = eval('('+s+')'); // データを評価してJavaScriptデータに変換
document.write( o['年齢'] ); </nowiki>
</syntaxhighlight>
 
Webページ等で、外部と通信しながら、その結果を動的反映していく[[w:Ajax|Ajax]]という手法では、この手法を使って主にデータの取り出しを行っている。
この様に、JavaScriptのデータ形式を文字列化([[w:シリアライズ#直列化|シリアライズ]])して、データのフォーマットして使われ出している。
この形式をJSON(JavaScript Object Notation)と言う。
 
実際には、コントロールされていない外部から文字列を受け取る場合には正しいJSONオブジェクフォーマットではなく評価に失敗することが多いありうるため、エラーチェックのためにtry~catch文で囲うのがある
エラーチェックのためにtry~catch文で囲うのが一般的である
 
<syntaxhighlight lang="javascript">
<nowiki>
var o;
try{
o = eval('('+s+')');
} catch(e){
// エラー処理
}
} </nowiki>
</syntaxhighlight>
 
近年の流れとして、一部のJavascriptJavaScript使用環境では、このJSON形式のデータを設定ファイルの保存形式等として使う流れも存在している。
その際の拡張子としては、.txt . js 等も使われたが、ゆっくりと.jsonを出来るだけ使うのが主流になりつつある で標準化された(MIME-Typeは application/json)
 
* [[w:JavaScript Object Notation|JavaScript Object Notation]]
 
これらの処理に、共有しているのはeval関数というのはJavaScriptでの入力結果を何の疑問も持たず処理評価するため強力ではあるが非常になゆえ危険でもあるこ、「エラー処理に飛ばなかった=安全」であるは言えません
 
{{コラム|JSONオブジェクト|
そのため、eval関数を実行する際には不正なコードを実行してしまわないように、その実行前にコードをチェックする必要がある。
JSONフォーマットの文字列をeval関数で評価することで不正なコードを実行してしまう危険を侵さぬよう、[[JavaScript/JSON|JSON オブジェクト]] がJavaScriptに加わり、JSON.parse() でJSON(であろう)文字列からJavaScriptのオブジェクトを、JSON.stringify() でJavaScriptのオブジェクトからJSONフォーマットの文字列をそれぞれ得ることが出来るよになりました。
}}
 
=== 数値処理関数 ===