のくす牧場
コンテンツ
牧場内検索
カウンタ
総計:127,647,440人
昨日:no data人
今日:
最近の注目
人気の最安値情報

私的良スレ書庫

不明な単語は2ch用語を / 要望・削除依頼は掲示板へ。不適切な画像報告もこちらへどうぞ。 / 管理情報はtwitter
ログインするとレス評価できます。 登録ユーザには一部の画像が表示されますので、問題のある画像や記述を含むレスに「禁」ボタンを押してください。

元スレ+ JavaScript の質問用スレッド vol.137 +

JavaScript スレッド一覧へ / JavaScript とは? / 携帯版 / dat(gz)で取得 / トップメニュー
スレッド評価: スレッド評価について
みんなの評価 :
タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。
レスフィルター : (試験中)
←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitter
851 : Name_Not - 2019/02/16(土) 23:32:15.92 ID:???.net (+37,-29,-8)
>>849
はい。文句あります。

a=foo(),b=bar(a),c=baz(b)
852 : Name_Not - 2019/02/16(土) 23:36:15.55 ID:???.net (+64,+29,-4)
どこが文句?副作用大好きなんだねとしか...
853 : Name_Not - 2019/02/16(土) 23:37:15.15 ID:???.net (+76,+29,-29)
>>845
偉そうな物言いは「破壊的代入」で説明されている部分を理解してからにしてくれませんかね
855 : Name_Not - 2019/02/16(土) 23:44:13.78 ID:???.net (+7,-30,-108)
ちなみに>>851を副作用なしで書くとこうなる。
const c = baz(bar(foo()));

tc39で議論されてるパイプラインオペレータが入ると将来こうも書ける。
const c = foo() |> bar |> baz;

まあfoo, bar, bazの中で副作用使ってるかどうかまでは関知しないが。
856 : Name_Not - 2019/02/16(土) 23:45:57.18 ID:???.net (+3,-29,-59)
> ちなみに>>851を副作用なしで書くとこうなる。
> const c = baz(bar(foo()));

ぷぷぷw

あれあれ?もしかして変数に代入したら
それは副作用だって思ってんの?
857 : Name_Not - 2019/02/16(土) 23:46:26.59 ID:???.net (+55,+27,-31)
「変数代入=副作用有」はネタじゃなくて本気だったんだな…
858 : Name_Not - 2019/02/16(土) 23:47:33.92 ID:???.net (+75,+30,-41)
ミュータブルと副作用の違いもわかってないっぽいし、律儀につき合うこともないと思うが…みんな真面目だな
859 : Name_Not - 2019/02/16(土) 23:51:44.85 ID:???.net (+38,-30,-146)
以下の3つはどれも全く同じ処理をしており副作用はありません。
これぐらいみんなわかりますよ?

function func() {
 return baz(bar(foo()));
}

function func() {
 const a = foo();
 const b = bar(a);
 const c = baz(b);
 return c;
}

function func() {
 const a = foo(), b = bar(a), c = baz(b);
 return c;
}
860 : Name_Not - 2019/02/16(土) 23:53:03.84 ID:???.net (+64,+29,-35)
ミュータブル以前の問題で「代表的な例は変数への値の代入」の説明を見て、反射的に脳内回路が出来上がっただけじゃないかね
説明の一部分だけ読んで早合点するやつは、最近珍しくない
861 : Name_Not - 2019/02/16(土) 23:55:16.16 ID:j33hsCXu.net (+35,+29,-5)
>>858
いや真面目なんじゃなくて
遊んでるだけだと思うw
862 : Name_Not - 2019/02/16(土) 23:56:03.71 ID:???.net (+42,-30,-152)
>>854の挙げているHaskellのコード
> a = 1
> b = 2
> c = a + b
>
> main = do
> print c
をあえてJavaScriptで同等に書くとこうなる。
const a = 1;
const b = 2;
const c = a + b;
console.log(c);

カンマ演算子を使った
a=1, b=2, c=a+b
の場合は、
a=1
b=2
c=a+b
の3expressionすべて副作用を持つ。
これは、a, b, cの各変数をvarで宣言済みか、letで宣言済みか、あるいは宣言なしのグローバルかに関わらず、である。
863 : Name_Not - 2019/02/16(土) 23:56:41.52 ID:???.net (+15,-30,-97)
>>860
そんな高度(?)なこと考えてないよ。
単に A, B で Aの部分で代入ができることに気づいてないマヌケってだけ

C言語のカンマ演算子の代表的な使い方であるfor文の初期化式でも代入してるのになぁ
for(int a=1, b=2, i=0, i < 10; i++)
864 : Name_Not - 2019/02/16(土) 23:57:27.20 ID:???.net (+2,-26,-13)
>>862
> の3expressionすべて副作用を持つ。

じゃあ、副作用の内容を言ってください
865 : Name_Not - 2019/02/16(土) 23:58:15.78 ID:???.net (+64,+29,-4)
>>862

>>859の何処に副作用があるのか言ってみてねw
866 : Name_Not - 2019/02/16(土) 23:58:35.96 ID:???.net (+57,+29,-35)
だから代入は副作用だって。
JSは副作用書けるしよく使うというだけの話だろ
867 : Name_Not - 2019/02/16(土) 23:59:17.76 ID:???.net (+2,-29,-51)
> だから代入は副作用だって

それだと純粋関数型言語であるHeskellにある代入(正確には束縛)
をどう説明すんの?
868 : Name_Not - 2019/02/17(日) 00:00:20.87 ID:???.net (+32,-29,-26)
>>867
自分で書いてんじゃん。
Haskellに代入はない。束縛のみ。
869 : Name_Not - 2019/02/17(日) 00:01:32.78 ID:???.net (+31,-30,-89)
const a=1, b=2, c=3 って書いたら
ちゃんとbもcもconstになるな。

ってことは
> const a = foo(), b = bar(a), c = baz(b);
は再代入できないから完全に副作用なしだ
870 : Name_Not - 2019/02/17(日) 00:01:56.64 ID:???.net (+0,-29,-14)
Haskellには代入無いぞw
871 : Name_Not - 2019/02/17(日) 00:02:01.52 ID:???.net (+62,+29,-22)
>>868
今は束縛かどうかじゃなくて、副作用があるかどうかです。

で、副作用あんの?
872 : Name_Not - 2019/02/17(日) 00:02:28.97 ID:???.net (+50,+23,+0)
>>869
これは副作用ないね。
873 : Name_Not - 2019/02/17(日) 00:02:44.40 ID:???.net (+3,-30,-62)
JavaScrptのconstへの代入は
値を変更できないから束縛相当になるよ

つまりこれは完全に副作用がないということ
> const a = foo(), b = bar(a), c = baz(b);
874 : Name_Not - 2019/02/17(日) 00:02:45.48 ID:???.net (+2,-20,-1)
>>870
STRef「呼んだ?」
875 : Name_Not - 2019/02/17(日) 00:03:23.31 ID:???.net (+57,+29,-18)
カンマ演算子使うことと、副作用にはな~んも関係ないってこったな
876 : Name_Not - 2019/02/17(日) 00:04:14.07 ID:TDJ/uZqY.net (+46,-30,-180)
日本語wikiだと
> 代表的な例は変数への値の代入である。
ってだけなのでちと分かりづらい

英語だと
> said to have a side effect if it modifies some state variable value(s) outside its local environment
とか
> 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.
とかあって分かりやすいね
877 : Name_Not - 2019/02/17(日) 00:04:27.03 ID:???.net (+11,-16,-48)
結論としてはこれ

> 単に A, B で Aの部分で代入ができることに気づいてないマヌケってだけ
878 : Name_Not - 2019/02/17(日) 00:04:48.69 ID:???.net (-8,-26,-14)
代入は副作用。
879 : Name_Not - 2019/02/17(日) 00:05:20.43 ID:???.net (-2,-30,-49)
constへの代入なら副作用はない

> const a = foo(), b = bar(a), c = baz(b);
880 : Name_Not - 2019/02/17(日) 00:05:20.95 ID:???.net (+27,-30,-43)
>>863
> for(int a=1, b=2, i=0, i < 10; i++)
C言語は知らないが、JavaScriptでは int を let に直したとして、カンマ演算子ではないぞ
881 : Name_Not - 2019/02/17(日) 00:06:16.31 ID:???.net (+53,+22,-12)
>>880
カンマ演算子です
882 : Name_Not - 2019/02/17(日) 00:07:08.48 ID:???.net (+3,-30,-41)
カンマ演算子
http://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Comma_Operator



このコードは、配列における対角線の要素の値を出力するものです。
for (var i = 0, j = 9; i <= 9; i++, j--)
883 : Name_Not - 2019/02/17(日) 00:07:22.10 ID:???.net (+81,+27,-3)
変数宣言時が特別扱いなんでしょ?
884 : Name_Not - 2019/02/17(日) 00:07:46.70 ID:???.net (+62,+29,-3)
>>883
勉強してから発言しろ
885 : Name_Not - 2019/02/17(日) 00:12:44.56 ID:???.net (+34,-30,-38)
じゃ[1,2,3].map(v => (v += 2, v * v));
も、[1,2,3].map(v => (const w = v + 2, w * w));って書けばいいな!
あ、あれ?(TдT)
886 : Name_Not - 2019/02/17(日) 00:14:25.92 ID:???.net (+11,-30,-30)
>>881-882
MDNが絶対的に正しいわけではないんだよ
仕様のSyntaxを確かめて
http://www.ecma-international.org/ecma-262/9.0/#sec-for-statement
887 : Name_Not - 2019/02/17(日) 00:15:34.96 ID:???.net (+62,+25,-5)
>>885
それは>>848で解説済だぞ?
888 : Name_Not - 2019/02/17(日) 00:18:15.34 ID:???.net (+57,+29,-44)
変数も代入も言語ごとに原理が異なるわけで、一律に「代入=副作用有」と考えるのが間違いの元
889 : Name_Not - 2019/02/17(日) 00:25:09.05 ID:???.net (+21,-30,-129)
>>886
for(Expression; Expression; Expression)Statement

12.16 Comma Operator ( , )
Syntax
Expression:
 AssignmentExpression
 Expression, AssignmentExpression

forのExpressionにはカンマ演算子が使えることを確認しました。
やはりカンマ演算子ですね
890 : Name_Not - 2019/02/17(日) 00:25:20.81 ID:???.net (-10,-30,-71)
function plus(a){
return b => a + b;
}

function square(n) {
return n * n;
}

function compose(...fs) {
return x => fs.reduce((y, f) => f(y), x);
}

[1, 2, 3].map(compose(plus, square));

うん、これで解決だな!
891 : Name_Not - 2019/02/17(日) 00:26:13.68 ID:???.net (+3,-30,-41)
[1,2,3].map(v => (v += 2, v * v));
最初のイテレーションで仮引数vに1が代入されたのち、v += 2することが副作用かどうかと、
それが副作用でも関数外に漏らしてないから問題ないのとは別の話では?
892 : Name_Not - 2019/02/17(日) 00:29:32.27 ID:???.net (+59,-21,-83)
だーかーら、マヌケってだけだろー

(>>849より)
> A, Bと書くとき、Aに期待できるのは副作用のみである。

↑に対して
単に A, B で Aの部分で代入ができることに気づいてないマヌケってだけ
893 : Name_Not - 2019/02/17(日) 00:30:16.81 ID:???.net (-8,-26,-14)
代入は副作用
894 : Name_Not - 2019/02/17(日) 00:31:24.65 ID:???.net (+33,+15,+0)
ではない
895 : Name_Not - 2019/02/17(日) 00:31:56.14 ID:???.net (+8,-30,-107)
>>889
> for(var VariableDeclarationList;Expressionopt;Expressionopt)Statement

ここは読んだか?
Expression の中に VariableStatement があったか?
VariableStatement の中に Comma Operator があったか?
896 : Name_Not - 2019/02/17(日) 00:32:41.29 ID:???.net (+31,-30,-17)
結局[1,2,3].map(v => (v += 2, v * v));のv += 2は副作用なの副作用じゃないの?あくしろ
897 : Name_Not - 2019/02/17(日) 00:32:53.83 ID:???.net (+65,+29,-48)
>>892
「代入=副作用」の認識だから、代入出来る事に気が付いても副作用で使えないと思ってるんだろ
899 : Name_Not - 2019/02/17(日) 00:34:14.04 ID:???.net (+57,+29,-9)
やっぱり変数宣言は特別なんじゃん
さっき勉強してから書けとか言ったやつ出てこいよ
900 : Name_Not - 2019/02/17(日) 00:35:24.38 ID:???.net (+0,-30,-34)
>>889
そもそも、その Expression だと
for (i = 0, j = 9; i <= 9; i++, j--) になるでしょ?
"var" という文字はどこから出てきたの?
←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / JavaScript スレッド一覧へ
スレッド評価: スレッド評価について
みんなの評価 :
タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。

類似してるかもしれないスレッド


トップメニューへ / →のくす牧場書庫について