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

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

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

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

Q&A

解決済

4回答

16055閲覧

JavaScriptリターンされたオブジェクトに直接値を代入する

hakasensei

総合スコア10

JavaScript

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

0グッド

0クリップ

投稿2016/06/12 15:22

編集2016/06/12 21:59

JavaScript

1var object={}; 2 3eval("object.number")=12;//ここでエラーUncaught ReferenceError: Invalid left-hand side in assignment

javascriptでオブジェクトをリターンする関数を作り、それをまるまる左辺においてみたのですが、
Uncaught ReferenceError: Invalid left-hand side in assignment
というエラーが出てしまいました。
なぜでしょうか?

初心者です。オブジェクトの理解が生半可です。

追記
例に出したコードが言おうとしていることと違うことに気づいたので訂正させていただきます。

javascript

1var object = {}; 2function myReturn(){ 3object.number=8; 4return object.number; 5} 6myReturn()=12;//エラー 7console.log(object.number);

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

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

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

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

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

guest

回答4

0

evalは、引数をJavaScript構文として評価してその値を返します。
書かれているコードがすべてだとすると、object.numberの値はundefinedという値になり、それへの代入はエラーになります。
なお、undefined = 12;となるわけじゃなくて、(undefinedの値) = 12;となります。
値への代入という意味では1 = 12;等と同じエラーメッセージですね。

objectnumberプロパティに代入したいのなら、例えば、

JavaScript

1object.number=12; 2eval("object").number=12; 3eval("object.number=12");

追記:
タイトルと質問内容が合ってない気がします。

投稿2016/06/12 16:24

編集2016/06/12 16:27
otn

総合スコア84421

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

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

hakasensei

2016/06/12 22:17

回答ありがとうございます。 割当は関数の中でしてしまうという前提の元質問しましたが、コードがそれとあっていませんでした。 質問に補足させていただきました。
otn

2016/06/12 22:24

> 質問に補足させていただきました。 同じ事ですね。 object.numberの値、つまり 8 がリターンされてくるので、8 = 12; でエラーになります。
guest

0

ベストアンサー

javascriptでオブジェクトをリターンする関数を作り

いいえ.オブジェクトをリターンするならこうなるはずです.

javascript

1var object = {}; 2eval('object').number = 12;

eval('object.number')はまだ存在していないので,undefinedをリターンしていることになります.


しかし本質は,関数の実行結果に対して代入しようとしているというところにあります.代入演算子の左側に来れるのは**「変数シンボル」(オブジェクトのプロパティを含む)のみに限られます.「値」**に対しての代入できません.

(注意) ここでいう「シンボル」はECMA Script 6の Symbol とは無関係です

javascript

1x = 1

javascript

1x

この2つのxの違いはわかりますか?1つ目は変数シンボルであり,2つ目は式です.式は評価されると値になります.JavaScriptは変数シンボルと式を区別しませんが,例えばシェルスクリプトは$の有無で区別しますよね.

Bash

1x=1

Bash

1$x

投稿2016/06/12 16:35

編集2016/06/12 16:40
mpyw

総合スコア5223

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

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

mpyw

2016/06/12 16:49

少しややこしいので補足します… eval('object') これは確かに「関数の実行結果」です.が, eval('object').number これは「『関数の実行結果』を元に特定されたオブジェクトのプロパティ」となります.このように,式から変数シンボルの記述に繋げることも可能です.
hakasensei

2016/06/12 22:03

丁寧な回答ありがとうございます。 なるほど。式の評価結果に無理に代入しようとしてしまっていたのですね。 では実行結果ではなく変数シンボルとして返すことは可能なのでしょうか?それともreturnされる時点で評価されてしまうのでしょうか?
hakasensei

2016/06/12 22:04

タイトルと質問内容が合ってないという指摘がありましたので、本文の下に追記をさせていただきました。
mpyw

2016/06/12 23:34 編集

残念ながら,JavaScriptでは全くできません.PHPの場合は参照代入の機能を持っているので,一度変数に代入すればそれっぽいことはできます…(直接できないのは文法上の都合です) <?php class Storage {     private $number;          public function &getNumberReference()     {         return $this->number;     }          public function getNumber()     {         return $this->number;     } } $s = new Storage; $x = &$s->getNumberReference(); $x = 8; var_dump($s->getNumber()); ただ,マニュアルの中でも「本当に必要な場合だけ導入を検討してください」のような但し書きがあります.可読性は大きく落ちるので利用は推奨されません,多くは設計ミスです.
hakasensei

2016/06/13 09:26

なるほど。javascriptではそのようなことはできないし、可読性を上げるためにも他の方法を使ったほうが良いということですね。 PHPではサポートされているんですね! 回答ありがとうございました。
guest

0

追記のは、

javascript

1var object = {}; 2 3function myReturn(num, def = 8) { 4 if (num === undefined || num === null) num = def; 5 object.number = num; 6 return object.number; 7} 8 9console.log(myReturn(12)) // 12 10console.log(myReturn()) // 8

こういうのを想定されているんですかね?

投稿2016/06/13 02:02

編集2016/06/13 02:22
hidekichi

総合スコア366

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

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

hakasensei

2016/06/13 09:22

ありがとうございます。そういうことです。
guest

0

割り当て方の問題ではないですか?

javascript

1eval("object.number=12");

投稿2016/06/12 15:59

編集2016/06/12 17:03
toshi_yama

総合スコア133

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

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

hakasensei

2016/06/12 21:50

回答ありがとうございます。「割り当ては関数の中で済ましておき、後でオブジェクトをリターンする」ということを示そうと思ってevalを使ってしまいました。 正しくはこうです。 ```javascript var object = {}; function myReturn(){ object.number=8; return object.number; } myReturn()=12;//エラー console.log(object.number); ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問