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

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

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

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

Q&A

解決済

3回答

1542閲覧

javascriptの引数について。

kakakakaka

総合スコア17

JavaScript

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

1グッド

3クリップ

投稿2018/12/07 05:42

javascript

1var a = null; //aを初期化 2function myFunc(x){ 3 x.key = "value"; 4} //myFuncという関数を定義 5myFunc(a || (a = {}));//<=ここ。 6console.log(a); //=>{"key": "value"}と出力される

引数で(a||(a = {}))と有るんですけど、一体全体どういう意味なのでしょうか。
そして、なぜ初期化の時にnull,undefined,0の時のみmyFuncが実行された後に{"key": "value"}と出力されるのでしょうか。もし、(a || (a = {}))で代入されるのだったらaが上3つ以外でも全てきちんと出力されるんじゃないんですか。

Lhankor_Mhy👍を押しています

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

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

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

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

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

ozwk

2018/12/07 05:45

「aが上3つ以外でも全てきちんと出力されるんじゃないんですか。」->されますよ?
kakakakaka

2018/12/07 08:03

Number,Stringとかの時に{}が代入されるんじゃないだろうか。という意味です。分かりにくくてすいませんm(_ _)m
guest

回答3

0

ベストアンサー

引数で(a||(a = {}))と有るんですけど、一体全体どういう意味なのでしょうか。

JavaScriptの||は、
左辺がtrueっぽい値ならば左辺を持ってくる。
左辺がfalseっぽい値ならば右辺を持ってくるという動きをします。

(a||(a = {}))の場合、左辺はaですね。
trueっぽい値、例えば1"hoge"{name: "taro"}等が入っている場合、右辺は実行されずそのままaの値が使われます。
falseっぽい値、例えば0""nullundefined等が入っている場合、左辺は値が無いので右辺を実行して値を探しに行きます。

右辺は(a = {})のようです。
代入式の実行結果は右辺がそのまま使われますから、
aに{}を代入しつつ、右辺の評価結果は{}という空オブジェクトになります。

なぜ初期化の時にnull,undefined,0の時のみmyFuncが実行された後に{"key": "value"}と出力されるのでしょうか。

少し難易度の高い話になりますが、
JavaScriptにはNumber、String、Booleanといったプリミティブ値と、
Object、Array、Functionといったオブジェクト系の値の2種類があります。

JavaScriptは完全なオブジェクト指向言語ではないので、
NumberやString、Booleanといったプリミティブ値はオブジェクトになったりそうでなかったり内部では変換を繰り返し、行ったり来たりします。

JavaScript

1var b = "taro"; 2// Stringであるbはこの瞬間だけString型のオブジェクトに変身するので別にエラーになったりはしない 3b.key = "value"; 4// その行を抜けるとプリミティブ値に戻るが、その時keyに代入した"value"は捨てられてしまう 5console.log(b.key); // undefined 6console.log(b); // "taro" 7 8// Stringオブジェクトとして生成してみる(非推奨なので普段はやらないでね) 9var c = new String("jiro"); 10c.key = "value"; 11console.log(c.key); // "value" 12console.log(c); // String {"jiro", key: "value"} 13 14// Stringオブジェクトは.toString()で正式な文字列として変換できるが、その際やっぱりkeyは捨てられる 15var d = c.toString(); 16console.log(d); // "jiro" 17console.log(d.key); // undefined

この辺の事情で、数値や文字列をaに代入すると上手く動かないという主張どおりになります。
逆に最初から何かしらのオブジェクトをaに与えておくと、正しく動作するはずです。
一度試してみて下さい。

投稿2018/12/07 06:15

編集2018/12/07 07:23
miyabi-sun

総合スコア21158

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

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

kakakakaka

2018/12/07 08:06

なるほど。丁寧に説明ありがとうございます。理解出来ましたm(_ _)m
guest

0

引数で(a||(a = {}))と有るんですけど、一体全体どういう意味なのでしょうか。

aがnullだったりした場合は空オブジェクトをaに代入してaを渡す。
そうでない場合はそのままaを渡す。

そして、なぜ初期化の時にnull,undefined,0の時のみmyFuncが実行された後に{"key": "value"}と出力されるのでしょうか。もし、(a || (a = {}))で代入されるのだったらaが上3つ以外でも全てきちんと出力されるんじゃないんですか。

var a={some:"value"}とでもすれば
ちゃんと{ some: 'value', key: 'value' }と出力されますよ?

投稿2018/12/07 05:50

ozwk

総合スコア13521

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

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

kakakakaka

2018/12/07 08:20

なるほど。回答ありがとうございますm(_ _)m
guest

0

null,undefined,0の時のみ

""やfalseも同じですね

javascript

1[null,0,"",undefined,false].forEach(function(x){ 2 a=(x||{}); 3 console.log(a); 4});

宣言されてないならこうですが

javascript

1function myFunc(x){ 2 x.key = "value"; 3} 4myFunc(a=((typeof a!=="undefined" && a)||{})); 5console.log(a);

strictだとどっちにしろエラーになるのであまり気にすることないかもしれません

ただし、考え方として1やら"0"やらのデータはオブジェクトにならないのに
0だとオブジェクトにキャストされてしまうのは、仕様がわるいと思いますけどね

投稿2018/12/07 06:13

編集2018/12/07 06:15
yambejp

総合スコア114839

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

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

kakakakaka

2018/12/07 08:18

なるほど。回答ありがとうございますm(_ _)m 下のコードの (typeof a!=="undefined" && a)←ここがちょっと理解できないんですけど、どゆことでしょうか
kakakakaka

2018/12/08 10:26

すいません、理解出来ました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問