X



+ JavaScript の質問用スレッド vol.137 +
レス数が1000を超えています。これ以上書き込みはできません。
0001Name_Not_Found
垢版 |
2019/01/06(日) 20:11:13.75ID:???
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/
0900Name_Not_Found
垢版 |
2019/02/17(日) 00:36:46.17ID:???
で結局[1,2,3].map(v => (v += 2, v * v));のv += 2は副作用なの?副作用じゃないの!!??
0902Name_Not_Found
垢版 |
2019/02/17(日) 00:38:45.87ID:???
>>894
> VariableStatement の中に Comma Operator があったか?

ないから、VariableStatement ではないということ
0903Name_Not_Found
垢版 |
2019/02/17(日) 00:41:22.56ID:???
>>900
代入は副作用ではない
再代入は副作用である

再代入を避けて代入だけにすれば
副作用はない
0904Name_Not_Found
垢版 |
2019/02/17(日) 00:42:09.09ID:???
>>901
悪いけど以下の(ア)に入るのは1か2か答えてくれる?1か2の一文字書くだけだから出来るよね?
[1,2,3].map(v => (v += 2, v * v));
のv += 2は(ア)である
1. 副作用である
2. 副作用ではない
0905Name_Not_Found
垢版 |
2019/02/17(日) 00:42:25.07ID:???
>>902
その一文に対しては「VariableStatement のカンマはカンマ演算子ではない」が正しい
君の一文を証明する事実は「Expression の中に VariableStatement がない」
従って、>>888の論理は成立しない
0906Name_Not_Found
垢版 |
2019/02/17(日) 00:42:55.45ID:???
やっぱり変数宣言は特別なんじゃん
さっき勉強してから書けとか言ったやつ出てこいよ
0907Name_Not_Found
垢版 |
2019/02/17(日) 00:44:40.52ID:???
>>904
Wikipediaの2つの成立条件を考えれば、2. は迷惑だろ
0908907
垢版 |
2019/02/17(日) 00:45:33.97ID:???
× 2. は迷惑だろ
〇 2. であることは明白だろ
0909Name_Not_Found
垢版 |
2019/02/17(日) 00:49:31.08ID:???
>>907>>908なるほどありがとう!
ではJavaScript質問スレ民の総意として、
[1,2,3].map(v => (v += 2, v * v));
のv += 2は副作用ではない。
と決定しました!
めでたい。早速Haskellスレに貼ってくりゅ!
0910Name_Not_Found
垢版 |
2019/02/17(日) 00:50:06.25ID:???
>>904
だから"再"代入だから副作用だっていってるだろ
それに対して、代入すべて副作用だって言ってるバカが居るから
一回しか行わない代入(つまりconstが使える場合)は
副作用じゃないって話をしてるんだが

その説明をしないと、お前がバカになりそうだからな
(代入は副作用っていったーって騒ぎまくりそうだからw)
0911Name_Not_Found
垢版 |
2019/02/17(日) 00:51:57.37ID:???
Numberで(値渡しで)考えるからおかしくなる
const xs = [[1], [2], [3]];
console.log(xs);
const ys = xs.map(v => (v[v.length] = 2, v.concat(v)));
console.log(xs);

これでわかるだろ
0915Name_Not_Found
垢版 |
2019/02/17(日) 00:56:14.01ID:???
>>911
v[v.length] =2よりv[0] +=2にするべきだったな、ごめん
0916Name_Not_Found
垢版 |
2019/02/17(日) 00:56:44.24ID:???
>>910
では、再代入が副作用の性質を持っている事を証明する実証コードを書いてくれ
0917Name_Not_Found
垢版 |
2019/02/17(日) 01:08:08.14ID:???
逆。副作用とは何を意味するか?の答えの一つが"再"代入
0918Name_Not_Found
垢版 |
2019/02/17(日) 01:09:03.51ID:???
定義なんだから実証コードなんてありゃしない
0919Name_Not_Found
垢版 |
2019/02/17(日) 01:09:15.39ID:???
>>917
うん。再代入しても副作用の性質が現われてないよね。
0920Name_Not_Found
垢版 |
2019/02/17(日) 01:10:45.31ID:???
>>911
それは「参照の値渡し」のことだな
オブジェクトのプロパティ操作が問題で再代入は関係ない
0921Name_Not_Found
垢版 |
2019/02/17(日) 01:14:20.92ID:???
>>919
関数の中では副作用の性質が現れてる。
関数を抜けると消えるってだけ
0922Name_Not_Found
垢版 |
2019/02/17(日) 01:16:50.17ID:???
>>921
で、それはどんな仕組み?
ガベージコレクションのことをいってるの?
0923Name_Not_Found
垢版 |
2019/02/17(日) 01:17:03.59ID:???
この質問者置いてけぼりでズレた議論かますのいかにもここの住人ぽいな
0925Name_Not_Found
垢版 |
2019/02/17(日) 01:19:37.00ID:???
「2. 他のいかなる機能の結果にも影響を与えない」の意味を理解しようともしないで、「代入=副作用」で思考停止しているだけ
0926Name_Not_Found
垢版 |
2019/02/17(日) 01:20:24.94ID:???
>>924
ローカル変数は内部変数なので、「2. 他のいかなる機能の結果にも影響を与えない」
0927Name_Not_Found
垢版 |
2019/02/17(日) 01:22:01.06ID:???
>>926
だから関数の外部には影響がないが、
内部(関数の中)では影響が出てるって>>921で書いたろ
お前俺のレスに周回遅れしてるぞ
0928Name_Not_Found
垢版 |
2019/02/17(日) 01:23:21.39ID:???
>>927
内部的動作なら副作用はない、って何度もいってる
0929Name_Not_Found
垢版 |
2019/02/17(日) 01:24:39.82ID:???
>>928
だから内部では影響出てるって言ってる
省略するんな
0930Name_Not_Found
垢版 |
2019/02/17(日) 01:25:15.18ID:???
>>929
だから、その動作は副作用ではないって何度もいってる
定義を妄想すんな
0931Name_Not_Found
垢版 |
2019/02/17(日) 01:26:39.35ID:???
> だから、その動作は副作用ではないって何度もいってる

その根拠は?何処かで誰かがそう言ってるの?
0933Name_Not_Found
垢版 |
2019/02/17(日) 01:28:28.54ID:???
[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)
0934Name_Not_Found
垢版 |
2019/02/17(日) 01:30:06.86ID:???
>>932
> プログラミングにおける副作用(ふくさよう)とは、ある機能がコンピュータの(論理的な)状態を変化させ、
> それ以降で得られる結果に影響を与えることをいう。代表的な例は変数への値の代入である。

って書いてますね。これが答えですね。
0935Name_Not_Found
垢版 |
2019/02/17(日) 01:31:06.98ID:???
誰かさんって>>847のことだな。
しれっと>>844が持ち出したことにしてるけど>>844そんなとこ触れてないw
0936Name_Not_Found
垢版 |
2019/02/17(日) 01:32:27.27ID:???
>>934
さすがwikipediaウソばっかり!信用できないな!
0937Name_Not_Found
垢版 |
2019/02/17(日) 01:36:17.95ID:???
>>934
だから、それは後ろの方に書いてある破壊的代入のことじゃないのか?
しかも、その一文だと再代入どころか代入全てアNGと受け取れるが、再代入だけNGとしたのはどうしてなんだ?
参照代入なら分かるが、JavaScriptで他に影響がある再代入なんてないだろ?
0938Name_Not_Found
垢版 |
2019/02/17(日) 01:38:00.97ID:???
Wikipediaの件は>>875が補完してくれているのに
0939Name_Not_Found
垢版 |
2019/02/17(日) 01:39:09.43ID:???
他板まで荒らしに行くとかやべーな
一昔前は毛の壁に目を付けられてたし、jsにはそういうのを惹きつける何かがあるんだろうな
0940Name_Not_Found
垢版 |
2019/02/17(日) 01:43:07.31ID:???
>>937
あのな? 「今回の例では問題ない」は副作用じゃないことの理由にはならないんだよ

> [1,2,3].map(v => (v += 2, v * v));
これじゃなくて
v += 2 だろ?

v += 2 に副作用があるかどうかだろ?
あるんだよ。
0941847
垢版 |
2019/02/17(日) 01:45:48.23ID:???
>>935
俺はURLを貼った>>844が発端(844がWikipediaを信頼したということ)だと思っているが、誰が持ち出したかなんてどうでも良くね?
ソース提供者の名ぐらいいくらでも譲る
0943Name_Not_Found
垢版 |
2019/02/17(日) 01:48:59.73ID:???
>>875が正解だと思うけどねえ
英文アレルギーの人はこれだから困る
0944Name_Not_Found
垢版 |
2019/02/17(日) 01:56:55.57ID:???
まとめ
カンマ演算子につき、
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;
})
と書いたときはどこにも副作用がない。カンマ演算子もどこにもない。
0945Name_Not_Found
垢版 |
2019/02/17(日) 01:59:02.59ID:???
まとめ

> カンマ演算子につき、
> A, Bと書くとき、Aに期待できるのは副作用のみである。
a = 1, b = a のような書き方ができるので間違い

単に A, B で Aの部分で代入ができることに気づいてないマヌケってだけ
0948Name_Not_Found
垢版 |
2019/02/17(日) 02:01:59.23ID:???
なら束縛すればいいのでは?
0949Name_Not_Found
垢版 |
2019/02/17(日) 02:02:52.92ID:???
>>945
そのカンマが(変数宣言ではなく)カンマ演算子である場合、a = 1もb = aも必ず代入であり副作用。
0950Name_Not_Found
垢版 |
2019/02/17(日) 02:03:52.20ID:???
>>948
だよな!こうすればいいんだよな!
[1,2,3].map(v => (const w = v + 2, w * w))
あ、あれ?(TдT)
0951Name_Not_Found
垢版 |
2019/02/17(日) 02:03:54.59ID:???
すげーな、スレ埋まるぞ
次スレには持ち込むなよ
0954Name_Not_Found
垢版 |
2019/02/17(日) 02:12:27.18ID:???
>>950
あなたが土屋太鳳に挿れられないように、そこには式(イケメン)しか入れられません。カンマ演算子は式しか取らないから。
宣言(お前)は挿れられません。
0956Name_Not_Found
垢版 |
2019/02/17(日) 02:18:07.28ID:???
>>834の妄想がここまでひどいとは思わなかった
0957Name_Not_Found
垢版 |
2019/02/17(日) 02:25:53.59ID:???
>>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
0958Name_Not_Found
垢版 |
2019/02/17(日) 02:26:02.20ID:???
まとめは>>953で十分だな
自分の知識の再確認だったが、日本語Wikipediaよりも確かに分かりやすかった
0959Name_Not_Found
垢版 |
2019/02/17(日) 02:27:09.97ID:???
>>957
代入が副作用なわけあるか。英語版Wikipediaも間違っている。
0960Name_Not_Found
垢版 |
2019/02/17(日) 02:28:36.22ID:???
>>957
C++の代入が副作用と言ってるだけでJavaScript代入は副作用なんかじゃないから。やっぱwikipedia信用ならない。
0961Name_Not_Found
垢版 |
2019/02/17(日) 02:30:01.22ID:???
>>957
また、脳内パーサが狂って、脊髄反射で代入全てが副作用と思い込んだな
学習しない奴だ
0962Name_Not_Found
垢版 |
2019/02/17(日) 02:32:26.72ID:???
>>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]
0963Name_Not_Found
垢版 |
2019/02/17(日) 02:38:58.79ID:???
>>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の評価結果を返す。
0965953
垢版 |
2019/02/17(日) 02:45:13.15ID:???
>>957
お礼は>>875にいってくれ
俺は英語版Wikipediaを探しただけだ
いずれにしても、”in C++” が目に入らずに迷走しているようだが
0966Name_Not_Found
垢版 |
2019/02/17(日) 02:48:25.94ID:???
>>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.
例えば代入は右オペランドを返し、かつそれと同じ値を変数に代入するという副作用を持ちます。
0967Name_Not_Found
垢版 |
2019/02/17(日) 02:50:10.97ID:???
>>966
わざわざC++って言ってるってことで気付かないか?

JavaScriptでは副作用じゃねーんだよ!!!

バーカ!w
0968Name_Not_Found
垢版 |
2019/02/17(日) 02:50:32.01ID:???
>>834の読解能力の低さがまた露呈してしまったな
0969Name_Not_Found
垢版 |
2019/02/17(日) 02:52:36.23ID:???
>>960も指摘してくれているんだけどね
この人、都合の悪いところは読み飛ばして、都合の良い部分だけ読むから、日本語でも通じないんだよね
0970Name_Not_Found
垢版 |
2019/02/17(日) 02:53:28.60ID:???
>>968
だなw
[1,2,3].map(v => (v += 2, v * v));
でv += 2の副作用なんて使ってないというのに。
C++じゃあるまいし。
0973Name_Not_Found
垢版 |
2019/02/17(日) 07:00:58.79ID:???
以上ここまで
今まで極狭義で都合のいい使い方しかしてなかったやつが
本来の意味を知って焦ってるの図でした
情報学科行けば習うことなのにね
0974Name_Not_Found
垢版 |
2019/02/17(日) 07:07:47.52ID:???
JSの場合valueOfなんかがあるから関数単位で副作用なしを保証するのは難しいんじゃないか?
0977Name_Not_Found
垢版 |
2019/02/17(日) 23:34:28.99ID:???
スレに、Ruby 禁止とか、jQuery, Lodash 禁止などを入れて、
スレ立てしてる奴は、荒らし!

そいつは他言語を理解できないから、禁止して荒らしくる

普通のプログラマーは、5言語ぐらい使えるのが普通。
荒らしは、働いてないニートだろ
0978Name_Not_Found
垢版 |
2019/02/17(日) 23:37:23.61ID:???
>>977
レス乞食はいい加減やめよう
みっともないぞ
0979Name_Not_Found
垢版 |
2019/02/17(日) 23:39:37.87ID:???
>>977
他言語を理解できないのはお前だろruby キチガイ死ね。
0980Name_Not_Found
垢版 |
2019/02/18(月) 00:43:27.95ID:???
>>977
だったらrubyスレは多言語歓迎だと宣言してよ
5言語の話題が乱れ飛ぶぐらい問題ないんでしょ
0981Name_Not_Found
垢版 |
2019/02/18(月) 05:59:47.29ID:???
んまぁモダンな俺はvue、nodeの話がしたいんだがねぇ
一応ここのレベルに合わせてるけどw
0982Name_Not_Found
垢版 |
2019/02/18(月) 09:09:50.83ID:???
それぞれスレあるんだが?w
検索もできないとは大した高レベルだことw
それとも質問スレで初心者相手にイキるのが生き甲斐のおじいちゃんかなw
0983Name_Not_Found
垢版 |
2019/02/18(月) 09:17:57.17ID:???
>>981
日本語読めない韓国人だろ
さっさと国へ帰れよ
0984Name_Not_Found
垢版 |
2019/02/18(月) 09:19:21.69ID:???
>>982
>>983
バカコーダーがイキっててワロタ
生JavaScriptを一生書いてろよレガシージジイ
0985Name_Not_Found
垢版 |
2019/02/18(月) 10:06:35.98ID:???
おじいちゃん「ジジイ!」

口の汚いおじいちゃんだことw
0986Name_Not_Found
垢版 |
2019/02/18(月) 12:44:38.26ID:???
>>984
専用スレで語れ、は正論だと思うがな
0987Name_Not_Found
垢版 |
2019/02/18(月) 12:49:18.25ID:???
質問スレは特定のライブラリやフレームワークの布教スレじゃないのに
まるで前提条件であるかの様に回答する奴が居るから困ってるんだけど
0988Name_Not_Found
垢版 |
2019/02/18(月) 13:03:20.86ID:???
>>987
無視が一番だが、質問者が反応してしまうから、そこに齟齬があると反応せざるを得ない奴だな
0994Name_Not_Found
垢版 |
2019/03/25(月) 18:46:05.58ID:???
最近jsをやり始めたんだが、メモ帳でhtml,cssが動くのに驚いていたらjavascriptもできて感動してる。
0995Name_Not_Found
垢版 |
2019/03/25(月) 18:47:08.73ID:???
ideいらないじゃん?
これってメモ帳がすごいのかjavascriptがすごいのかもうわからない。
0997Name_Not_Found
垢版 |
2019/03/25(月) 20:58:53.47ID:???
テキストエディタの存在を知らない世代
0998Name_Not_Found
垢版 |
2019/03/25(月) 22:55:50.05ID:???
>>996
IDEがプログラムを実行してると勘違いしてる
0999Name_Not_Found
垢版 |
2019/03/25(月) 23:21:10.53ID:???
さっぱりわからん
メモ帳でhtmlやcssが動くとかjavascriptができるってどういう意味だ?
ソースを編集できるっていう意味か?
レス数が1000を超えています。これ以上書き込みはできません。