のくす牧場
コンテンツ
牧場内検索
カウンタ
総計:127,062,909人
昨日: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
    901 = :

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

    902 = :

    >>896,901
    既に説明されてるだろ

    903 = :

    >>895
    > VariableStatement の中に Comma Operator があったか?

    ないから、VariableStatement ではないということ

    905 = :

    >>902
    悪いけど以下の(ア)に入るのは1か2か答えてくれる?1か2の一文字書くだけだから出来るよね?
    [1,2,3].map(v => (v += 2, v * v));
    のv += 2は(ア)である
    1. 副作用である
    2. 副作用ではない

    906 = :

    >>903
    その一文に対しては「VariableStatement のカンマはカンマ演算子ではない」が正しい
    君の一文を証明する事実は「Expression の中に VariableStatement がない」
    従って、>>889の論理は成立しない

    907 = :

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

    908 = :

    >>905
    Wikipediaの2つの成立条件を考えれば、2. は迷惑だろ

    909 = :

    × 2. は迷惑だろ
    〇 2. であることは明白だろ

    910 = :

    >>908>>909なるほどありがとう!
    ではJavaScript質問スレ民の総意として、
    [1,2,3].map(v => (v += 2, v * v));
    のv += 2は副作用ではない。
    と決定しました!
    めでたい。早速Haskellスレに貼ってくりゅ!

    911 = :

    >>905
    だから"再"代入だから副作用だっていってるだろ
    それに対して、代入すべて副作用だって言ってるバカが居るから
    一回しか行わない代入(つまりconstが使える場合)は
    副作用じゃないって話をしてるんだが

    その説明をしないと、お前がバカになりそうだからな
    (代入は副作用っていったーって騒ぎまくりそうだからw)

    912 = :

    Numberで(値渡しで)考えるからおかしくなる
    const xs = [[1], [2], [3]];
    console.log(xs);
    const ys = xs.map(v => (v[v.length] = 2, v.concat(v)));
    console.log(xs);

    これでわかるだろ

    914 = :

    俺も貼ってきた!
    http://mevius.5ch.net/test/read.cgi/tech/1548720347/152

    915 = :

    さらに>>152の経緯を書いてきた!
    http://mevius.5ch.net/test/read.cgi/tech/1548720347/153

    917 = :

    >>911
    では、再代入が副作用の性質を持っている事を証明する実証コードを書いてくれ

    918 = :

    逆。副作用とは何を意味するか?の答えの一つが"再"代入

    919 = :

    定義なんだから実証コードなんてありゃしない

    920 = :

    >>918
    うん。再代入しても副作用の性質が現われてないよね。

    921 = :

    >>912
    それは「参照の値渡し」のことだな
    オブジェクトのプロパティ操作が問題で再代入は関係ない

    922 = :

    >>920
    関数の中では副作用の性質が現れてる。
    関数を抜けると消えるってだけ

    923 = :

    >>922
    で、それはどんな仕組み?
    ガベージコレクションのことをいってるの?

    924 = :

    この質問者置いてけぼりでズレた議論かますのいかにもここの住人ぽいな

    925 = :

    >>923
    ローカル変数vのこと

    926 = :

    「2. 他のいかなる機能の結果にも影響を与えない」の意味を理解しようともしないで、「代入=副作用」で思考停止しているだけ

    927 = :

    >>925
    ローカル変数は内部変数なので、「2. 他のいかなる機能の結果にも影響を与えない」

    928 = :

    >>927
    だから関数の外部には影響がないが、
    内部(関数の中)では影響が出てるって>>922で書いたろ
    お前俺のレスに周回遅れしてるぞ

    929 = :

    >>928
    内部的動作なら副作用はない、って何度もいってる

    930 = :

    >>929
    だから内部では影響出てるって言ってる
    省略するんな

    931 = :

    >>930
    だから、その動作は副作用ではないって何度もいってる
    定義を妄想すんな

    932 = :

    > だから、その動作は副作用ではないって何度もいってる

    その根拠は?何処かで誰かがそう言ってるの?

    934 = :

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

    ちなみに>>908>>909のお陰で
    [1,2,3].map(v => (v += 2, v * v));
    のv += 2は副作用ではない。
    と決定しました! 👀
    Rock54: Caution(BBR-MD5:1341adc37120578f18dba9451e6c8c3b)

    935 = :

    >>933
    > プログラミングにおける副作用(ふくさよう)とは、ある機能がコンピュータの(論理的な)状態を変化させ、
    > それ以降で得られる結果に影響を与えることをいう。代表的な例は変数への値の代入である。

    って書いてますね。これが答えですね。

    936 = :

    誰かさんって>>848のことだな。
    しれっと>>845が持ち出したことにしてるけど>>845そんなとこ触れてないw

    937 = :

    >>935
    さすがwikipediaウソばっかり!信用できないな!

    938 = :

    >>935
    だから、それは後ろの方に書いてある破壊的代入のことじゃないのか?
    しかも、その一文だと再代入どころか代入全てアNGと受け取れるが、再代入だけNGとしたのはどうしてなんだ?
    参照代入なら分かるが、JavaScriptで他に影響がある再代入なんてないだろ?

    939 = :

    Wikipediaの件は>>876が補完してくれているのに

    940 = :

    他板まで荒らしに行くとかやべーな
    一昔前は毛の壁に目を付けられてたし、jsにはそういうのを惹きつける何かがあるんだろうな

    941 = :

    >>938
    あのな? 「今回の例では問題ない」は副作用じゃないことの理由にはならないんだよ

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

    v += 2 に副作用があるかどうかだろ?
    あるんだよ。

    942 = :

    >>936
    俺はURLを貼った>>845が発端(844がWikipediaを信頼したということ)だと思っているが、誰が持ち出したかなんてどうでも良くね?
    ソース提供者の名ぐらいいくらでも譲る

    943 = :

    >>941
    根拠を示せ

    944 = :

    >>876が正解だと思うけどねえ
    英文アレルギーの人はこれだから困る

    945 = :

    まとめ
    カンマ演算子につき、
    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;
    })
    と書いたときはどこにも副作用がない。カンマ演算子もどこにもない。

    946 = :

    まとめ

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

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

    947 = :

    >>946

    それが結論だなwwww

    949 = :

    なら束縛すればいいのでは?

    950 = :

    >>946
    そのカンマが(変数宣言ではなく)カンマ演算子である場合、a = 1もb = aも必ず代入であり副作用。


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

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


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