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

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

JavaScript覧 / PC版 /
スレッド評価: スレッド評価について
みんなの評価 :
タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。
←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitter

851 = :

>>849
はい。文句あります。

a=foo(),b=bar(a),c=baz(b)

852 = :

どこが文句?副作用大好きなんだねとしか...

853 = :

>>845
偉そうな物言いは「破壊的代入」で説明されている部分を理解してからにしてくれませんかね

855 = :

ちなみに>>851を副作用なしで書くとこうなる。
const c = baz(bar(foo()));

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

まあfoo, bar, bazの中で副作用使ってるかどうかまでは関知しないが。

856 = :

> ちなみに>>851を副作用なしで書くとこうなる。
> const c = baz(bar(foo()));

ぷぷぷw

あれあれ?もしかして変数に代入したら
それは副作用だって思ってんの?

857 = :

「変数代入=副作用有」はネタじゃなくて本気だったんだな…

858 = :

ミュータブルと副作用の違いもわかってないっぽいし、律儀につき合うこともないと思うが…みんな真面目だな

859 = :

以下の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 = :

ミュータブル以前の問題で「代表的な例は変数への値の代入」の説明を見て、反射的に脳内回路が出来上がっただけじゃないかね
説明の一部分だけ読んで早合点するやつは、最近珍しくない

861 :

>>858
いや真面目なんじゃなくて
遊んでるだけだと思うw

862 = :

>>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 = :

>>860
そんな高度(?)なこと考えてないよ。
単に A, B で Aの部分で代入ができることに気づいてないマヌケってだけ

C言語のカンマ演算子の代表的な使い方であるfor文の初期化式でも代入してるのになぁ
for(int a=1, b=2, i=0, i < 10; i++)

864 = :

>>862
> の3expressionすべて副作用を持つ。

じゃあ、副作用の内容を言ってください

865 = :

>>862

>>859の何処に副作用があるのか言ってみてねw

866 = :

だから代入は副作用だって。
JSは副作用書けるしよく使うというだけの話だろ

867 = :

> だから代入は副作用だって

それだと純粋関数型言語であるHeskellにある代入(正確には束縛)
をどう説明すんの?

868 = :

>>867
自分で書いてんじゃん。
Haskellに代入はない。束縛のみ。

869 = :

const a=1, b=2, c=3 って書いたら
ちゃんとbもcもconstになるな。

ってことは
> const a = foo(), b = bar(a), c = baz(b);
は再代入できないから完全に副作用なしだ

871 = :

>>868
今は束縛かどうかじゃなくて、副作用があるかどうかです。

で、副作用あんの?

872 = :

>>869
これは副作用ないね。

873 = :

JavaScrptのconstへの代入は
値を変更できないから束縛相当になるよ

つまりこれは完全に副作用がないということ
> const a = foo(), b = bar(a), c = baz(b);

874 = :

>>870
STRef「呼んだ?」

875 = :

カンマ演算子使うことと、副作用にはな~んも関係ないってこったな

876 :

日本語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 = :

結論としてはこれ

> 単に A, B で Aの部分で代入ができることに気づいてないマヌケってだけ

880 = :

>>863
> for(int a=1, b=2, i=0, i < 10; i++)
C言語は知らないが、JavaScriptでは int を let に直したとして、カンマ演算子ではないぞ

881 = :

>>880
カンマ演算子です

882 = :

カンマ演算子
http://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Comma_Operator



このコードは、配列における対角線の要素の値を出力するものです。
for (var i = 0, j = 9; i <= 9; i++, j--)

883 = :

変数宣言時が特別扱いなんでしょ?

884 = :

>>883
勉強してから発言しろ

885 = :

じゃ[1,2,3].map(v => (v += 2, v * v));
も、[1,2,3].map(v => (const w = v + 2, w * w));って書けばいいな!
あ、あれ?(TдT)

886 = :

>>881-882
MDNが絶対的に正しいわけではないんだよ
仕様のSyntaxを確かめて
http://www.ecma-international.org/ecma-262/9.0/#sec-for-statement

887 = :

>>885
それは>>848で解説済だぞ?

888 = :

変数も代入も言語ごとに原理が異なるわけで、一律に「代入=副作用有」と考えるのが間違いの元

889 = :

>>886
for(Expression; Expression; Expression)Statement

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

forのExpressionにはカンマ演算子が使えることを確認しました。
やはりカンマ演算子ですね

891 = :

[1,2,3].map(v => (v += 2, v * v));
最初のイテレーションで仮引数vに1が代入されたのち、v += 2することが副作用かどうかと、
それが副作用でも関数外に漏らしてないから問題ないのとは別の話では?

892 = :

だーかーら、マヌケってだけだろー

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

↑に対して
単に A, B で Aの部分で代入ができることに気づいてないマヌケってだけ

894 = :

ではない

895 = :

>>889
> for(var VariableDeclarationList;Expressionopt;Expressionopt)Statement

ここは読んだか?
Expression の中に VariableStatement があったか?
VariableStatement の中に Comma Operator があったか?

896 = :

結局[1,2,3].map(v => (v += 2, v * v));のv += 2は副作用なの副作用じゃないの?あくしろ

897 = :

>>892
「代入=副作用」の認識だから、代入出来る事に気が付いても副作用で使えないと思ってるんだろ

899 = :

やっぱり変数宣言は特別なんじゃん
さっき勉強してから書けとか言ったやつ出てこいよ

900 = :

>>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一覧へ
スレッド評価: スレッド評価について
みんなの評価 :
タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。

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


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