質問: ``` ``` レンダリングする時に定義したboardの中身にはclassが入っており、これは自身の変数xを持っているのですが、一つ目のアラートでは「object object」と表示されるのですが 二つ目のアラートではundefinedとなってしまいます。 ちなみに下記のようにやるとうまくいきます ``` ``` 違いがわかりません。教えていただけると助かります。
回答: > > javascriptとejsの変数の受け渡しについて > > > 文字列以外は無理です。 後で具体的に何をするか解説します。 > > `var board= "<%= board %>";` > > > まずはこの辺を解説します。 JavaScriptというのはWebサーバーからHTMLファイルを受け取ったユーザーのブラウザが、 「おっ、スクリプトタグあるやんけ、実行したろ」と実行するものです。 ejsのこの書き方では文字列として出力しているので、 実際には下記のようなことになっています。 ``` > ({name: "taro"}).toString() "[object Object]" ``` オブジェクトやClassのインスタンスを無理やり文字列(String型)にキャストすると `"[object Object]"`という文字列になります。 つまりJS内の`board`変数は`"[object Object]"`という文字列が格納され、 文字列は`x`プロパティなんて持っていないのでundefinedになるというからくりです。 > > どうすれば解決するか > > > シリアライズしましょう。 JSON形式の文字列にして持ち込むのが基本です。 ``` ``` Classのインスタンスを直接JSON化するとそれなりに頑張ってくれますが、 メソッドが捨てられたりプロパティが抜け落ちたりするので 汎用オブジェクトに一度変換するなどしてください。 ``` > class hoge { } > i = new hoge() > i.name = "taro" > JSON.stringify(i) "{"name":"taro"}" <- ちゃんと変換されはしてるのね ```