パスワードを忘れた? アカウント作成
11368488 journal
プログラミング

baldmageの日記: JavaScriptに参照渡しha 23

日記 by baldmage

いまだにJavaScriptのオブジェクトは参照渡しだと主張している人がいるっぽいので試してみた。

function func(hoge) { hoge = { bar: 2 }; }
var foo = { bar: 1 };
func(foo);
console.log(foo.bar); //=> 1

どう見ても値渡しです本当にありがとうございました。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by Anonymous Coward on 2014年07月31日 5時21分 (#2648540)

    JSには参照渡しがないので、所謂参照の値渡しのことを値渡しと区別して参照渡しと呼ぶのですよ。
    そもそもこの手のものは、必ずしも外から見た挙動で、仕様や内部実装が判断できるとも限りませんし、「参照」や「渡す」の意味、定義だって言語によって異なります。
    それなのに一部の言語界での用語を他の言語界に押し付けようとするのは誤りです。

    • by 130R (31126) on 2014年07月31日 16時21分 (#2648826) 日記

      どっちが勝手な定義つかってんだか。

      親コメント
      • by Anonymous Coward

        押し付けるのは良くないという話は筋が通ってるが
        勝手だと言うのは何を根拠にして言っているのだろうか

        • by Anonymous Coward

          押し付けるのは良くないって主張って、要するに 1+1=2 は押し付けだから良くないって主張と一緒なんだけど……

          本当に押し付けるのは良くないって主張は筋通ってるんか?

          • by Anonymous Coward

            何がどう一緒なのかが分からない。
            用語なんて遥かに定義が時と場合によって違ったり危ういものだろうに、
            論理と決まりごとの積み重ねでできてきた数学の基礎と同じくらい確かなものと信じてやまないのは、流石にどうかと思う。

            • by Anonymous Coward

              社会の変化等の影響を受けて移ろいやすい流行語や、ある程度の言い間違いや聞き間違いや誤用を許容しなければ成り立たない口語など、広い意味での「言葉」とは違って、専門用語や学術用語として使用される言葉は統一された意味で用いられなければ議論がなりたたなくなり、多くの時間が無駄になります。

              数学の基礎と同じぐらい確かなものでなければならないと考えます。

              • by Anonymous Coward

                他で書いてる人いるけどクラスの問題と同じ。
                前提が違う環境においては当然言葉の捉え方や使われ方は変わってくる。
                これも他の人が書いてるけど、そもそもポインタ渡しを参照渡しというのだって、
                その言語での習慣(参照≒ポインタ)を前提とした広義の使い方をしてる。

              • by Anonymous Coward

                そもそも、この「参照渡し」とか「値渡し」ってのは言語屋界隈の用語なわけで、言語毎に「参照」の意味が微妙に違ったとしても「参照渡し」の「参照」は言語毎の「参照」には影響されません。

                言語屋界隈で「値渡し」「変数渡し」あるいは「参照渡し」と同列に「ポインタ渡し」を使用する事はありません。新しい造語である「ポインタ渡し」は既存の専門用語と衝突しないので、「参照の値渡し」を「参照渡し」と呼ぶ事とは全く違います。

              • by Anonymous Coward

                これは必ずしも「参照の値渡し」という用語を「参照渡し」という名前で呼んでいるのではないと思う、そこに誤解があるかな
                JavaScriptの代入においての挙動で、用語として「プリミティブ型は「値渡し」されると言います」、「非プリミティブ型は「参照渡し」されると言います」、という説明をしているケースはアウトだと思うけど、代入でのオブジェクトのコピーが参照(の値)のコピーであることを、「参照渡し」という言葉を使って表現しているのは言葉として間違いではないからセーフではないかな
                実際に参照が渡っていくわけだしね

              • by Anonymous Coward

                その文脈でも「参照渡し」って使ったらアウトだろうね。理由は容易に区別できなくて混乱招くから。

                「参照を渡しています」あたりならセーフだろうけど。

              • by Anonymous Coward

                JSにおいては区別できるよ。

              • by Anonymous Coward

                無理っす。

              • by Anonymous Coward

                参照は渡してないでしょ
                ESの仕様上は(参照の)値渡ししかないよ

              • by Anonymous Coward

                そっちの方が余計混乱するだろw

  • by Anonymous Coward on 2014年07月31日 7時35分 (#2648561)

    を参照渡しといっているのと同じ。
    確かに厳密には違うのだけどもね。でもC++で参照渡しが出てきたからCでも厳密に違うようになっただけで。

    • by Anonymous Coward

      確かに確かに参照渡しと言わずポインタ渡し、もしくはより広く一般的な意味の変数渡しと言った方がいいのかも。

      • by Anonymous Coward

        用語としては変数渡し(call by variable)は値渡し(call by value)と対になる言葉で、変数渡しの実装法としてメジャーなものの一つが参照渡し(call by reference)って関係です。

        なので、ポインタ渡しで止めておくのが吉じゃねーかと。

        JavaScriptとかのはポインタじゃないので値渡しとしか呼びようがないっすね。もしくは参照の値渡し。

        • by Anonymous Coward

          ECMAScriptでは仕様上で参照はReference型のオブジェクトみたいなもので表されてる
          ESの仕様はかなり抽象化されてて、実際の実装は自由にどうぞって感じが大きい
          だから、「参照の値渡し」という言葉で片付けられるのかが疑問

          実際著名な実装みると最適化のためにプリミティブ型も整数を除いてイミュータブルなオブジェクトとして実装されてたりする(整数はポインタ埋め込み)
          だから実際は内部的にはほとんど「参照の値渡し」と言っていい

          でもそもそも言葉の定義として、「オブジェクトは」って頭についてるんだから、
          代入演算子等が右辺の型によって「参照渡し」と「値渡し」を切り替えるなんて普通考えないから
          「オブジェクトは参照渡し」っていうのは、『ああ、オブジェクトは代入時にコピーされないんだな』って分かるからそんなに問題だとは思わないな

  • by Anonymous Coward on 2014年07月31日 11時48分 (#2648677)

    だったら例えばC言語なんて、「参照渡しはポインタ渡しです」とか言うのかよ?
    関数呼出も「どうみても常時ポインタ呼び出しです」とか、配列操作も「どうみてもポインタ演算です」とかやるんか?
    関数も「どうみても関数じゃなく手続きです」とか騒ぐのかと?

    どう見てもbaldmageはアスペルガー症候群です本当にありがとうございました。

    • by Anonymous Coward

      C言語は値渡ししかないですよ。
      それ以外に言いようがない。

      • by Anonymous Coward

        多くの言語で値渡ししかないのに、参照渡しという言葉が誤って使われてるよね。

  • by Anonymous Coward on 2014年07月31日 17時00分 (#2648852)

    よく勘違いされがちだがプロトタイプベースは、クラスがないんじゃなくて用意された「クラス」というシステムに依存しないだけ。
    必要であれば自分で好きな「クラス」システムを作って使えるのが強みなわけ。

    要はオブジェクトの雛形を記述できればクラスと呼んでいいわけ。
    じゃなきゃJSのclass構文で定義されたものを取り上げる時、『~クラス』ではなく、『新オブジェクト初期化関数及びプロトタイプ定義群』とでも呼ぶのだろうか。

  • by Anonymous Coward on 2014年08月01日 12時51分 (#2649154)

    JSの変数っていうのはscopeオブジェクトのプロパティでしかない。
    だからb に a を変数渡しするということは、
    scope.bへのアクセスをscope.aにリダイレクトすればいいということになる。

    基本的にscopeを触ることはできないが、with文を使うと任意のオブジェクトをスコープチェーンの先頭に追加できる。
    そしてそのオブジェクトをProxyにすることで可能。

    with(new CBVScopeProxy) {
    $var('a', 'b').define()
    a = 1
    b = 2
    $var('b').redirectTo('a')
    a = 3
    b // 3
    }

typodupeerror

私は悩みをリストアップし始めたが、そのあまりの長さにいやけがさし、何も考えないことにした。-- Robert C. Pike

読み込み中...