+ JavaScript の質問用スレッド vol.137 +
レス数が1000を超えています。これ以上書き込みはできません。
JavaScript を自ら学ぶ人のための質問スレッドです。
次スレは>>950が(本スレで改善案があれば考慮して)立ててください
■規則/推奨ルール
・メール欄を空欄にし、名前にレス番を入れることを強く推奨(なりすまし防止)
・質問内容は具体的に。言葉だけでなく、出来る限り再現性を確認したサンプルコードの掲示。
・質問テンプレートの利用推奨。
・質問への「答え」から解離した議論はよそでやること。
■禁止行為
・丸投げ質問
・迷惑スクリプトの質問
・オレオレ用語の使用(一般的な用語を使用する事)
・煽り、批判等の他人を不快にさせる行為(批判の代わりに「AよりBが良い」のような代案を出す事)
■質問テンプレート
【環境】OS, ブラウザをバージョンと共に記入してください。
【条件】期待する回答の条件を書いてください。
【何をしたのか】何をしたら問題の現象が発生するのか。再現手順を具体的に書いてください。
【エラーメッセージ】エラーメッセージがあれば正確に書き写してください。
【期待する結果】最終的にどういう結果を望んでいるのか、を書いてください。
【サンプルコード】現象を再現可能な最小限のコードを書いてください。
1レスに収まらないならコード投稿サイトを利用してください。
http://jsdo.it/ http://jsbin.com/ http://jsfiddle.net/ http://ideone.com/
※前スレ
+ JavaScript の質問用スレッド vol.136 +
http://mevius.5ch.net/test/read.cgi/hp/1542707959/ で結局[1,2,3].map(v => (v += 2, v * v));のv += 2は副作用なの?副作用じゃないの!!?? >>894
> VariableStatement の中に Comma Operator があったか?
ないから、VariableStatement ではないということ >>900
代入は副作用ではない
再代入は副作用である
再代入を避けて代入だけにすれば
副作用はない >>901
悪いけど以下の(ア)に入るのは1か2か答えてくれる?1か2の一文字書くだけだから出来るよね?
[1,2,3].map(v => (v += 2, v * v));
のv += 2は(ア)である
1. 副作用である
2. 副作用ではない >>902
その一文に対しては「VariableStatement のカンマはカンマ演算子ではない」が正しい
君の一文を証明する事実は「Expression の中に VariableStatement がない」
従って、>>888の論理は成立しない やっぱり変数宣言は特別なんじゃん
さっき勉強してから書けとか言ったやつ出てこいよ >>904
Wikipediaの2つの成立条件を考えれば、2. は迷惑だろ × 2. は迷惑だろ
〇 2. であることは明白だろ >>907>>908なるほどありがとう!
ではJavaScript質問スレ民の総意として、
[1,2,3].map(v => (v += 2, v * v));
のv += 2は副作用ではない。
と決定しました!
めでたい。早速Haskellスレに貼ってくりゅ! >>904
だから"再"代入だから副作用だっていってるだろ
それに対して、代入すべて副作用だって言ってるバカが居るから
一回しか行わない代入(つまりconstが使える場合)は
副作用じゃないって話をしてるんだが
その説明をしないと、お前がバカになりそうだからな
(代入は副作用っていったーって騒ぎまくりそうだからw) Numberで(値渡しで)考えるからおかしくなる
const xs = [[1], [2], [3]];
console.log(xs);
const ys = xs.map(v => (v[v.length] = 2, v.concat(v)));
console.log(xs);
これでわかるだろ >>911
v[v.length] =2よりv[0] +=2にするべきだったな、ごめん >>910
では、再代入が副作用の性質を持っている事を証明する実証コードを書いてくれ 逆。副作用とは何を意味するか?の答えの一つが"再"代入 >>917
うん。再代入しても副作用の性質が現われてないよね。 >>911
それは「参照の値渡し」のことだな
オブジェクトのプロパティ操作が問題で再代入は関係ない >>919
関数の中では副作用の性質が現れてる。
関数を抜けると消えるってだけ >>921
で、それはどんな仕組み?
ガベージコレクションのことをいってるの? この質問者置いてけぼりでズレた議論かますのいかにもここの住人ぽいな 「2. 他のいかなる機能の結果にも影響を与えない」の意味を理解しようともしないで、「代入=副作用」で思考停止しているだけ >>924
ローカル変数は内部変数なので、「2. 他のいかなる機能の結果にも影響を与えない」 >>926
だから関数の外部には影響がないが、
内部(関数の中)では影響が出てるって>>921で書いたろ
お前俺のレスに周回遅れしてるぞ >>927
内部的動作なら副作用はない、って何度もいってる >>928
だから内部では影響出てるって言ってる
省略するんな >>929
だから、その動作は副作用ではないって何度もいってる
定義を妄想すんな > だから、その動作は副作用ではないって何度もいってる
その根拠は?何処かで誰かがそう言ってるの? [1,2,3].map(v => (v += 2, v * v));
最初のイテレーションで仮引数vに1が代入されたのち、v += 2することが副作用かどうかと、
それが副作用でも関数外に漏らしてないから問題ないのとは別の話では?
ちなみに>>907>>908のお陰で
[1,2,3].map(v => (v += 2, v * v));
のv += 2は副作用ではない。
と決定しました! 👀
Rock54: Caution(BBR-MD5:1341adc37120578f18dba9451e6c8c3b) >>932
> プログラミングにおける副作用(ふくさよう)とは、ある機能がコンピュータの(論理的な)状態を変化させ、
> それ以降で得られる結果に影響を与えることをいう。代表的な例は変数への値の代入である。
って書いてますね。これが答えですね。 誰かさんって>>847のことだな。
しれっと>>844が持ち出したことにしてるけど>>844そんなとこ触れてないw >>934
さすがwikipediaウソばっかり!信用できないな! >>934
だから、それは後ろの方に書いてある破壊的代入のことじゃないのか?
しかも、その一文だと再代入どころか代入全てアNGと受け取れるが、再代入だけNGとしたのはどうしてなんだ?
参照代入なら分かるが、JavaScriptで他に影響がある再代入なんてないだろ? Wikipediaの件は>>875が補完してくれているのに 他板まで荒らしに行くとかやべーな
一昔前は毛の壁に目を付けられてたし、jsにはそういうのを惹きつける何かがあるんだろうな >>937
あのな? 「今回の例では問題ない」は副作用じゃないことの理由にはならないんだよ
> [1,2,3].map(v => (v += 2, v * v));
これじゃなくて
v += 2 だろ?
v += 2 に副作用があるかどうかだろ?
あるんだよ。 >>935
俺はURLを貼った>>844が発端(844がWikipediaを信頼したということ)だと思っているが、誰が持ち出したかなんてどうでも良くね?
ソース提供者の名ぐらいいくらでも譲る >>875が正解だと思うけどねえ
英文アレルギーの人はこれだから困る まとめ
カンマ演算子につき、
A, Bと書くとき、Aに期待できるのは副作用のみである。
カンマ演算子が取れるのは式(Expression)のみである。
変数宣言(VariableStatement)は宣言であって式ではない。
すなわち、
const a = 1, b = 2
は変数宣言であり、
またこのカンマはカンマ演算子ではない。
[1,2,3].map(v => (v += 2, v * v));
のv += 2は仮引数vを書き換える副作用である。
カンマ演算子は式(Expression)しか取れないので、副作用なく
[1,2,3].map(v => (const w = v + 2, w * w))
などと書くことはできない。
なぜならconst w = v + 2は変数宣言(Statement)であって式(Expression)ではないからである。
カンマ演算子を使わず
[1,2,3].map(v => {
const w = v + 2;
return w * w;
})
と書いたときはどこにも副作用がない。カンマ演算子もどこにもない。 まとめ
> カンマ演算子につき、
> A, Bと書くとき、Aに期待できるのは副作用のみである。
a = 1, b = a のような書き方ができるので間違い
単に A, B で Aの部分で代入ができることに気づいてないマヌケってだけ >>945
そのカンマが(変数宣言ではなく)カンマ演算子である場合、a = 1もb = aも必ず代入であり副作用。 >>948
だよな!こうすればいいんだよな!
[1,2,3].map(v => (const w = v + 2, w * w))
あ、あれ?(TдT) >>875のソースはこれかな
https://en.wikipedia.org/wiki/Side_effect_(computer_science)
5chの匿名意見よりもこっちを読んだ方がいいと思うよ >>950
あなたが土屋太鳳に挿れられないように、そこには式(イケメン)しか入れられません。カンマ演算子は式しか取らないから。
宣言(お前)は挿れられません。 >>953
どれどれ?
> One common demonstration of side effect behavior is that of the assignment operator in C++.
> For example, assignment returns the right operand and has the side effect of assigning that value to a variable.
なるほど。
すぅーっ…
代入は副作用ーーーッ!!
source:
https://en.wikipedia.org/wiki/Side_effect_(computer_science)
Thanks to >>953 まとめは>>953で十分だな
自分の知識の再確認だったが、日本語Wikipediaよりも確かに分かりやすかった >>957
代入が副作用なわけあるか。英語版Wikipediaも間違っている。 >>957
C++の代入が副作用と言ってるだけでJavaScript代入は副作用なんかじゃないから。やっぱwikipedia信用ならない。 >>957
また、脳内パーサが狂って、脊髄反射で代入全てが副作用と思い込んだな
学習しない奴だ >>959
いや、よく読めよ
>>875がポイントとなる一文を抽出してくれているだろ
Example side effects include modifying a non-local variable, modifying a static local variable, modifying a mutable argument passed by reference, performing I/O or calling other side-effect functions.[1] >>961
[1,2,3].map(v => (v += 2, v * v));
のv += 2はどっちかな?
答え:
v += 2は、
・式全体としてv + 2の評価結果を返す主作用と、
・その値をvに代入するという副作用を持つ。
式v += 2、式v * vとカンマ演算子からなる式(v += 2, v * v)は、v += 2の主作用は捨て、副作用により更新されたvの値を用いv * vの評価結果を返す。 >>957
お礼は>>875にいってくれ
俺は英語版Wikipediaを探しただけだ
いずれにしても、”in C++” が目に入らずに迷走しているようだが >>957の訳
> One common demonstration of side effect behavior is that of the assignment operator in C++.
副作用の振る舞いの一般的なデモとしては、C++の代入演算子があります。
> For example, assignment returns the right operand and has the side effect of assigning that value to a variable.
例えば代入は右オペランドを返し、かつそれと同じ値を変数に代入するという副作用を持ちます。 >>966
わざわざC++って言ってるってことで気付かないか?
JavaScriptでは副作用じゃねーんだよ!!!
バーカ!w >>834の読解能力の低さがまた露呈してしまったな >>960も指摘してくれているんだけどね
この人、都合の悪いところは読み飛ばして、都合の良い部分だけ読むから、日本語でも通じないんだよね >>968
だなw
[1,2,3].map(v => (v += 2, v * v));
でv += 2の副作用なんて使ってないというのに。
C++じゃあるまいし。 以上ここまで
今まで極狭義で都合のいい使い方しかしてなかったやつが
本来の意味を知って焦ってるの図でした
情報学科行けば習うことなのにね JSの場合valueOfなんかがあるから関数単位で副作用なしを保証するのは難しいんじゃないか? スレに、Ruby 禁止とか、jQuery, Lodash 禁止などを入れて、
スレ立てしてる奴は、荒らし!
そいつは他言語を理解できないから、禁止して荒らしくる
普通のプログラマーは、5言語ぐらい使えるのが普通。
荒らしは、働いてないニートだろ >>977
レス乞食はいい加減やめよう
みっともないぞ >>977
他言語を理解できないのはお前だろruby キチガイ死ね。 >>977
だったらrubyスレは多言語歓迎だと宣言してよ
5言語の話題が乱れ飛ぶぐらい問題ないんでしょ んまぁモダンな俺はvue、nodeの話がしたいんだがねぇ
一応ここのレベルに合わせてるけどw それぞれスレあるんだが?w
検索もできないとは大した高レベルだことw
それとも質問スレで初心者相手にイキるのが生き甲斐のおじいちゃんかなw >>981
日本語読めない韓国人だろ
さっさと国へ帰れよ >>982
>>983
バカコーダーがイキっててワロタ
生JavaScriptを一生書いてろよレガシージジイ おじいちゃん「ジジイ!」
口の汚いおじいちゃんだことw 質問スレは特定のライブラリやフレームワークの布教スレじゃないのに
まるで前提条件であるかの様に回答する奴が居るから困ってるんだけど >>987
無視が一番だが、質問者が反応してしまうから、そこに齟齬があると反応せざるを得ない奴だな 最近jsをやり始めたんだが、メモ帳でhtml,cssが動くのに驚いていたらjavascriptもできて感動してる。 ideいらないじゃん?
これってメモ帳がすごいのかjavascriptがすごいのかもうわからない。 >>996
IDEがプログラムを実行してると勘違いしてる さっぱりわからん
メモ帳でhtmlやcssが動くとかjavascriptができるってどういう意味だ?
ソースを編集できるっていう意味か? レス数が1000を超えています。これ以上書き込みはできません。