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

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

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

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

Q&A

解決済

2回答

547閲覧

オブジェクト型データを格納した変数と関数の引数が別物なのに正常に動く理由が知りたいです。

atago_IT

総合スコア8

JavaScript

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

0グッド

1クリップ

投稿2023/02/21 13:14

前提

オブジェクト型データを格納した変数を関数の引数に指定しています。
オブジェクト型データを格納した変数と関数の引数が別物なのですが、どうして正常に動いているのかがわかりません。

発生している問題・エラーメッセージ

エラーメッセージはありません。

該当のソースコード

JavaScript

1let personTaro = { name : "Taro" , age : 20 }; // Taroさんをモデル化して表現 2 3function zikoSyoukai( person ){ 4 console.log( "こんにちは、" + person.name + "と申します" ); 5 console.log( "年齢は" + person.age + "歳です" ); 6} 7 8zikoSyoukai( personTaro );

補足情報(FW/ツールのバージョンなど)

OS:Raspberry Pi OS
ブラウザ:Chromium
参考リンク:JavaScriptで関数の引数にオブジェクト型データを指定する方法を現役エンジニアが解説【初心者向け】

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

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

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

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

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

y_waiwai

2023/02/21 13:26

オブジェクト型データを格納した変数、ってどれのこと言ってますか?
guest

回答2

0

ベストアンサー

関数を実行する際の引数で渡されるのは変数名ではなく、中身の値であるということがポイントです。

javascript

1zikoSyoukai( personTaro );

javascript

1zikoSyoukai( { name: "Taro", age: 20 } );

として実行されているのです。(厳密にはオブジェクトはポインタで渡されているので違うのですが)
(こうでないと関数の引数として数値や文字列を直接記述できないということになってしまいます)

一方、function行は定義であり、personは引数として入力された値を受け取る変数名です。
「zikoSyoukai関数が呼び出されたときの、1つ目の引数をpersonという変数名で受け取る」ということです。
そのため、person{ name : "Taro" , age : 20 }が代入され、あたかも変数名が違うのに参照できているよう見えているのです。

ちなみに、変数にはスコープという概念があり、提示されたコードではzikoSyoukaiの中でもpersonTaroにはアクセス可能なため、別途誤解が生まれる可能性があります。
https://developer.mozilla.org/ja/docs/Glossary/Scope

また、参考サイトとしてあげられているサイトは内容が不十分で誤った内容やコードも多いため見ないことを推奨しておきます。(かといって、このサイトがオススメみたいなものも提示し辛いですが)

投稿2023/02/22 01:45

編集2023/02/22 02:11
ziopuzzle

総合スコア90

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

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

atago_IT

2023/03/07 12:02

体調が悪くて遅くなりました。 わかりやすいご回答ありがとうございました! 疑問が解決できました。
guest

0

初心者あるあるですね。僕も最初、疑問だった覚えがあります。

関数の引数 zikoSyoukai( personTaro ); 
を入れると、そのメソッド内のスコープで定義された変数に割り当てられます。

Attachとでも表現すればいいでしょうか。 この場合、引数に入れる型さえ合っていればどのようなものでもいいのです(PersonTaro は関数内で代入されてpersonとし扱われる)。

つまり person = PersonTaro ; が非明示的に行われているのです。---
これはJavaScriptに限らず、殆どどのような言語でも同様です。

この例ではpersonクラスで定義された型以外の変数を引数としていれるとエラーになるのだと思われます。
letは暗黙の型宣言のようなので微妙なところですが

C#のような言語だと文字列型やint型などの宣言をきちんと行います。

投稿2023/02/21 13:49

sheephuman

総合スコア112

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

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

otn

2023/02/21 15:06

中学高校の数学で関数を学んだと思いますが、f(x) = 2*x+1 みたいな定義で、 f(t) と引数がx以外の場合の意味がわからなかったりしてたんでしょうかね?
sheephuman

2023/02/21 15:26

数学とプログラミング言語はなんというかパラダイム的なモノが違うかと思うんですね。言語書くときに数学的に考えるかというと、余程数学好きでもない限りはプログラミング言語独自の考え方になると思うんです。どっちかというと最初は文系寄りの認識にならざる負えないのかなと思います。 本件の質問は初心者の認識としてはそれほど珍しいものでなないと考えてる
otn

2023/02/22 07:39

> 本件の質問は初心者の認識としてはそれほど珍しいものでなないと考えてる このサイトでもたまに見かけますね。 数学とプログラミング言語はいろいろなところで同じでは無いですが、 「f(x) = 2*x+1 みたいな定義で、 f(t) と引数がx以外の場合の意味を理解できる頭」 と、 「関数定義の仮引数名と、関数呼び出しの実引数の変数名の関係を理解できる頭」 は同じだと思います。プログラミングになると頭が硬直しちゃうのかな。
sheephuman

2023/02/22 16:12

そういう数式自体馴染みがないです。数学でジェネリック使うかっていうとそうじゃないと思うし。 大抵の初学者は数学ぎらいだし、それが理解出来てたら最初から質問なんてしないだろうという
atago_IT

2023/03/07 12:02

お時間を割いていただきありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問