
baldmageの日記: JavaScriptに参照渡しha 23
日記 by
baldmage
いまだにJavaScriptのオブジェクトは参照渡しだと主張している人がいるっぽいので試してみた。
function func(hoge) { hoge = { bar: 2 }; }
var foo = { bar: 1 };
func(foo);
console.log(foo.bar); //=> 1
どう見ても値渡しです本当にありがとうございました。
いまだにJavaScriptのオブジェクトは参照渡しだと主張している人がいるっぽいので試してみた。
function func(hoge) { hoge = { bar: 2 }; }
var foo = { bar: 1 };
func(foo);
console.log(foo.bar); //=> 1
どう見ても値渡しです本当にありがとうございました。
私は悩みをリストアップし始めたが、そのあまりの長さにいやけがさし、何も考えないことにした。-- Robert C. Pike
言葉狩り良くない (スコア:0)
JSには参照渡しがないので、所謂参照の値渡しのことを値渡しと区別して参照渡しと呼ぶのですよ。
そもそもこの手のものは、必ずしも外から見た挙動で、仕様や内部実装が判断できるとも限りませんし、「参照」や「渡す」の意味、定義だって言語によって異なります。
それなのに一部の言語界での用語を他の言語界に押し付けようとするのは誤りです。
呼ぶのですよ(キリッ (スコア:1)
どっちが勝手な定義つかってんだか。
Re: (スコア:0)
押し付けるのは良くないという話は筋が通ってるが
勝手だと言うのは何を根拠にして言っているのだろうか
Re: (スコア:0)
押し付けるのは良くないって主張って、要するに 1+1=2 は押し付けだから良くないって主張と一緒なんだけど……
本当に押し付けるのは良くないって主張は筋通ってるんか?
Re: (スコア:0)
何がどう一緒なのかが分からない。
用語なんて遥かに定義が時と場合によって違ったり危ういものだろうに、
論理と決まりごとの積み重ねでできてきた数学の基礎と同じくらい確かなものと信じてやまないのは、流石にどうかと思う。
Re: (スコア:0)
社会の変化等の影響を受けて移ろいやすい流行語や、ある程度の言い間違いや聞き間違いや誤用を許容しなければ成り立たない口語など、広い意味での「言葉」とは違って、専門用語や学術用語として使用される言葉は統一された意味で用いられなければ議論がなりたたなくなり、多くの時間が無駄になります。
数学の基礎と同じぐらい確かなものでなければならないと考えます。
Re: (スコア:0)
他で書いてる人いるけどクラスの問題と同じ。
前提が違う環境においては当然言葉の捉え方や使われ方は変わってくる。
これも他の人が書いてるけど、そもそもポインタ渡しを参照渡しというのだって、
その言語での習慣(参照≒ポインタ)を前提とした広義の使い方をしてる。
Re: (スコア:0)
そもそも、この「参照渡し」とか「値渡し」ってのは言語屋界隈の用語なわけで、言語毎に「参照」の意味が微妙に違ったとしても「参照渡し」の「参照」は言語毎の「参照」には影響されません。
言語屋界隈で「値渡し」「変数渡し」あるいは「参照渡し」と同列に「ポインタ渡し」を使用する事はありません。新しい造語である「ポインタ渡し」は既存の専門用語と衝突しないので、「参照の値渡し」を「参照渡し」と呼ぶ事とは全く違います。
Re: (スコア:0)
これは必ずしも「参照の値渡し」という用語を「参照渡し」という名前で呼んでいるのではないと思う、そこに誤解があるかな
JavaScriptの代入においての挙動で、用語として「プリミティブ型は「値渡し」されると言います」、「非プリミティブ型は「参照渡し」されると言います」、という説明をしているケースはアウトだと思うけど、代入でのオブジェクトのコピーが参照(の値)のコピーであることを、「参照渡し」という言葉を使って表現しているのは言葉として間違いではないからセーフではないかな
実際に参照が渡っていくわけだしね
Re: (スコア:0)
その文脈でも「参照渡し」って使ったらアウトだろうね。理由は容易に区別できなくて混乱招くから。
「参照を渡しています」あたりならセーフだろうけど。
Re: (スコア:0)
JSにおいては区別できるよ。
Re: (スコア:0)
無理っす。
Re: (スコア:0)
参照は渡してないでしょ
ESの仕様上は(参照の)値渡ししかないよ
Re: (スコア:0)
そっちの方が余計混乱するだろw
Cのポインタ渡し (スコア:0)
を参照渡しといっているのと同じ。
確かに厳密には違うのだけどもね。でもC++で参照渡しが出てきたからCでも厳密に違うようになっただけで。
Re: (スコア:0)
確かに確かに参照渡しと言わずポインタ渡し、もしくはより広く一般的な意味の変数渡しと言った方がいいのかも。
Re: (スコア:0)
用語としては変数渡し(call by variable)は値渡し(call by value)と対になる言葉で、変数渡しの実装法としてメジャーなものの一つが参照渡し(call by reference)って関係です。
なので、ポインタ渡しで止めておくのが吉じゃねーかと。
JavaScriptとかのはポインタじゃないので値渡しとしか呼びようがないっすね。もしくは参照の値渡し。
Re: (スコア:0)
ECMAScriptでは仕様上で参照はReference型のオブジェクトみたいなもので表されてる
ESの仕様はかなり抽象化されてて、実際の実装は自由にどうぞって感じが大きい
だから、「参照の値渡し」という言葉で片付けられるのかが疑問
実際著名な実装みると最適化のためにプリミティブ型も整数を除いてイミュータブルなオブジェクトとして実装されてたりする(整数はポインタ埋め込み)
だから実際は内部的にはほとんど「参照の値渡し」と言っていい
でもそもそも言葉の定義として、「オブジェクトは」って頭についてるんだから、
代入演算子等が右辺の型によって「参照渡し」と「値渡し」を切り替えるなんて普通考えないから
「オブジェクトは参照渡し」っていうのは、『ああ、オブジェクトは代入時にコピーされないんだな』って分かるからそんなに問題だとは思わないな
クッソ面倒臭え奴だな…… (スコア:0)
だったら例えばC言語なんて、「参照渡しはポインタ渡しです」とか言うのかよ?
関数呼出も「どうみても常時ポインタ呼び出しです」とか、配列操作も「どうみてもポインタ演算です」とかやるんか?
関数も「どうみても関数じゃなく手続きです」とか騒ぐのかと?
どう見てもbaldmageはアスペルガー症候群です本当にありがとうございました。
Re: (スコア:0)
C言語は値渡ししかないですよ。
それ以外に言いようがない。
Re: (スコア:0)
多くの言語で値渡ししかないのに、参照渡しという言葉が誤って使われてるよね。
JSにはクラスはないという巫山戯た主張と同じ (スコア:0)
よく勘違いされがちだがプロトタイプベースは、クラスがないんじゃなくて用意された「クラス」というシステムに依存しないだけ。
必要であれば自分で好きな「クラス」システムを作って使えるのが強みなわけ。
要はオブジェクトの雛形を記述できればクラスと呼んでいいわけ。
じゃなきゃJSのclass構文で定義されたものを取り上げる時、『~クラス』ではなく、『新オブジェクト初期化関数及びプロトタイプ定義群』とでも呼ぶのだろうか。
JSでも変数渡しは可能 (スコア:0)
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
}