+ JavaScript の質問用スレッド vol.137 +
■ このスレッドは過去ログ倉庫に格納されています
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/ jQueryなんぞとっくにマスターしててヒマだから新しい概念のフレームワークなど楽しく勉強してるというのにjQueryバカは「jQuery以外不要!勉強するな!俺が勉強してないのにムキーッ」
とスレチでつっかかってくるので遊んであげてるだけ。ムダだと思うのは自由だからお前が勉強しなきゃいいだけだろってw
なーに人の勉強内容にケチつけてんのかね。もうjQueryに学ぶことなんてないよw >>798
そりゃウェブアプリに限ればそうだろうよw
殆どがウェブサイトだからな >>799
そんな話してないぞ?
jQueryはオワコンじゃなくて
両方使いましょうって話をしてる DOMを管理するライブラリ/フレームワークは基本的に共存できない。
angular react vueなどのvDOM勢からしたらそこまでしてわざわざ軒先貸してあげるメリットがまるで無い。 ようするにブラウザ標準のDOM APIとフレームワークは相性が悪いわけ
DOM APIを直接(またはjQueryなどのライブラリを使って)操作することを
禁止しているから web componentsが完成すれば、コンポーネント(≒HTMLタグ)を
プログラマが作ってウェブデザイナはそのHTMLタグを使う時代になる
コンポーネントは既存のHTMLタグの機能を拡張して動きをつけたものだが
汎用的なものであるためデザインは含まない(デフォルトがある程度)
デザインはCSSでやるという今と同じ流れ
コンポーネント自体はDOM APIを使って作るだろう。
じゃあjQueryは不要になるのか?というと、コンポーネント同士の連携で使われる
CSSでコンポーネントにデザインを、jQueryでコンポーネント同士の連携を。
そこにフレームワークは登場しない つける動きがもうコンポーネント作る時点で作ってあるんだから出番ねーよw
さすがに要素の移動程度ネイティブapiでやるわwww rubyといいjQueryといい本尊が落ちぶれた信者は大変だな。
まぁ迷惑だから出ていけ。 parcel+react+flow←どんなイメージ? CSSで切り欠き部分まで一杯にコンテンツを表示しているときに
対象の要素の隠れた部分、もしくは切り欠き部分のマスクを取得、計算するにはどうしたら良いでしょうか? 要素のonclick属性と、click()のバインドは全く別物なのでしょうか?
上書きされることはないのでしょうか
https://jsfiddle.net/0a231k9s/ onclick属性
addEventListener('click', e)
jQueryのclick(e)やon('click', e)
これら3つは別物と考えてok
jQueryは内部でaddEventListener使ってるけどイベントハンドラは独自管理 無名関数の代わりにアロー関数を使う事はありますか?
互換性とthisのバインドの違いが怖くてビビって使えない >>820
ありがとうございます
使えるように勉強します すいません初心者の質問です
JSでは、C言語みたいに、1つの式しか書けない所で、「i++,j」みたいに書くことで
「i++という処理だけをして、その結果を捨てて、そこに入る値としてはjを使う」
という文法ってあるんでしょうか?
ちなみにこの文法のことをC言語で正式に何と呼ぶのか分からないので
Javascriptにこれがあるかどうかもうまく調べられないという状況です カンマ演算子を好んで使う職業プログラマなんておらんだろ
関数型云々とか関係ない コンマ演算子
https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%9E%E6%BC%94%E7%AE%97%E5%AD%90
プログラミング言語 C および C++ におけるコンマ演算子(コンマえんざんし)は、
左被演算子を評価しその値を捨て、その後右被演算子を評価する演算子である。
順次演算子(じゅんじえんざんし)もしくは順次評価演算子 (sequential-evaluation operator) と
呼称されることもある[1][2][3]。JIS X3010ではコンマ演算子と表記されている。 >>826
積極的に使うわけではないが、一つの文にしたい時には使う アロー関数の略式で使うことあるし、関数型云々は関係ないな 副作用嫌う関数型主義者がA,BでAには副作用しか期待できないカンマ演算子を許すはずがない 皆さんありがとうございます。
カンマ演算子と言うんですね。そしてjsにもあると。
大変勉強になりました。 >>835
> カンマ演算子を使う事が副作用のトリガーではない
正しい。
が、A,BでAの部分で副作用を使わない場合はAの部分は全くなにもしないということ。それは単にBと書くことと同じである。
A,Bと書くということは、普通はAの部分で何か処理をさせる。
その場合その処理とは副作用以外あり得ない。
別に一般の言語では普通のことだが関数型信者は許せないのである。 >>837
> その場合その処理とは副作用以外あり得ない。
なぜ? >>837
> が、A,BでAの部分で副作用を使わない場合はAの部分は全くなにもしないということ。それは単にBと書くことと同じである。
「副作用を伴わない=何もしない」って本気でそう思ってるのか...
返り値に影響する処理なら何もしてないわけではないだろうに A,BでAが帰り値に影響を与えるということは、すなわちAの部分は副作用を持つ。よく考えてみるんだな。
例:
var a;
var b = (a = 1, a + 2);
悪いとは言ってない。普通だ。
これを悪いと考えるのが関数型信者なのだ。 副作用を伴わない関数↓
const nosf = n => n * 2;
const unko = (nosf(3), 10);
nosf(3)の唯一の成果は捨てられる。
=意味がない
=const unko = 10;と書くのと一緒
=何もしないのと一緒
副作用を伴う関数↓
const sf = n => {console.log(n);};
const unko = (sf(3), 10);
単にconst unko = 10;と書くのとは違い、3がコンソールに出力される。
=意味がある。そして副作用でもある。
A, Bと書くとき、Aに期待できるのは副作用のみである。
だからなんだ?なんでもない。ただそれが関数型信者は許せないのである。 CPUに計算はさせてんじゃん。捨てられる無駄な計算をw >>840
やはり、ロジックがおかしい
再考を推奨する
[1,2,3].map(v => (v += 2, v * v)); // [9, 16, 25]
>>841
変数名からして汚いコードだな... >>843
オーケーオーケー、つまりあなたは
v += 2
の部分が副作用じゃないと言いたいんだな?
そっかぁそうだったのかぁ…
やっぱりwikipediaは信用できないなぁw
https://ja.m.wikipedia.org/wiki/副作用_(プログラム)
プログラミングにおける副作用(ふくさよう)とは、ある機能がコンピュータの(論理的な)状態を変化させ、それ以降で得られる結果に影響を与えることをいう。代表的な例は変数への値の代入である。 副作用が何かも知らないやつが突っかかってんのか
知らないなら黙ってりゃいいのに >>844
君の出したところによると、参照透過性の満たすべき条件は、
1. 同じ条件を与えれば必ず同じ結果が得られる
2. 他のいかなる機能の結果にも影響を与えない
なわけだが、
[1,2,3].map(v => (v += 2, v * v));
は副作用があって、
[1,2,3].map(v => { const x = v + 2; return x * x; });
は副作用がない、といいたいのだな?
どちらも、1,2の条件を満たしており、他のいかなるスコープの変数にも影響を与えないとしても、前者は副作用があるのだな? >>847
A, Bと書くとき、Aに期待できるのは副作用のみである。
何か文句ありますか?以上。 >>848
副作用がないコードは既に説明した、といっておこう >>848
はい。文句あります。
a=foo(),b=bar(a),c=baz(b) >>844
偉そうな物言いは「破壊的代入」で説明されている部分を理解してからにしてくれませんかね >>851
副作用というのは、関数(>>850でいうfoo, bar, baz)の
戻り値以外に影響を与えることなので、>>850には副作用はありません
純粋関数型言語Heskellの例
https://qiita.com/7shi/items/145f1234f8ec2af923ef
> a = 1
> b = 2
> c = a + b
>
> main = do
> print c
カンマ演算子を使うと
a=1, b=2, c=a+b
となる。ここに副作用はない ちなみに>>850を副作用なしで書くとこうなる。
const c = baz(bar(foo()));
tc39で議論されてるパイプラインオペレータが入ると将来こうも書ける。
const c = foo() |> bar |> baz;
まあfoo, bar, bazの中で副作用使ってるかどうかまでは関知しないが。 > ちなみに>>850を副作用なしで書くとこうなる。
> const c = baz(bar(foo()));
ぷぷぷw
あれあれ?もしかして変数に代入したら
それは副作用だって思ってんの? 「変数代入=副作用有」はネタじゃなくて本気だったんだな… ミュータブルと副作用の違いもわかってないっぽいし、律儀につき合うこともないと思うが…みんな真面目だな 以下の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;
} ミュータブル以前の問題で「代表的な例は変数への値の代入」の説明を見て、反射的に脳内回路が出来上がっただけじゃないかね
説明の一部分だけ読んで早合点するやつは、最近珍しくない >>857
いや真面目なんじゃなくて
遊んでるだけだと思うw >>853の挙げている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で宣言済みか、あるいは宣言なしのグローバルかに関わらず、である。 >>859
そんな高度(?)なこと考えてないよ。
単に A, B で Aの部分で代入ができることに気づいてないマヌケってだけ
C言語のカンマ演算子の代表的な使い方であるfor文の初期化式でも代入してるのになぁ
for(int a=1, b=2, i=0, i < 10; i++) >>861
> の3expressionすべて副作用を持つ。
じゃあ、副作用の内容を言ってください >>861
>>858の何処に副作用があるのか言ってみてねw だから代入は副作用だって。
JSは副作用書けるしよく使うというだけの話だろ > だから代入は副作用だって
それだと純粋関数型言語であるHeskellにある代入(正確には束縛)
をどう説明すんの? >>866
自分で書いてんじゃん。
Haskellに代入はない。束縛のみ。 const a=1, b=2, c=3 って書いたら
ちゃんとbもcもconstになるな。
ってことは
> const a = foo(), b = bar(a), c = baz(b);
は再代入できないから完全に副作用なしだ >>867
今は束縛かどうかじゃなくて、副作用があるかどうかです。
で、副作用あんの? JavaScrptのconstへの代入は
値を変更できないから束縛相当になるよ
つまりこれは完全に副作用がないということ
> const a = foo(), b = bar(a), c = baz(b); カンマ演算子使うことと、副作用にはな〜んも関係ないってこったな 日本語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.
とかあって分かりやすいね 結論としてはこれ
> 単に A, B で Aの部分で代入ができることに気づいてないマヌケってだけ constへの代入なら副作用はない
> const a = foo(), b = bar(a), c = baz(b); >>862
> for(int a=1, b=2, i=0, i < 10; i++)
C言語は知らないが、JavaScriptでは int を let に直したとして、カンマ演算子ではないぞ じゃ[1,2,3].map(v => (v += 2, v * v));
も、[1,2,3].map(v => (const w = v + 2, w * w));って書けばいいな!
あ、あれ?(TдT) 変数も代入も言語ごとに原理が異なるわけで、一律に「代入=副作用有」と考えるのが間違いの元 >>885
for(Expression; Expression; Expression)Statement
12.16 Comma Operator ( , )
Syntax
Expression:
AssignmentExpression
Expression, AssignmentExpression
forのExpressionにはカンマ演算子が使えることを確認しました。
やはりカンマ演算子ですね 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));
うん、これで解決だな! [1,2,3].map(v => (v += 2, v * v));
最初のイテレーションで仮引数vに1が代入されたのち、v += 2することが副作用かどうかと、
それが副作用でも関数外に漏らしてないから問題ないのとは別の話では? だーかーら、マヌケってだけだろー
(>>848より)
> A, Bと書くとき、Aに期待できるのは副作用のみである。
↑に対して
単に A, B で Aの部分で代入ができることに気づいてないマヌケってだけ >>888
> for(var VariableDeclarationList;Expressionopt;Expressionopt)Statement
ここは読んだか?
Expression の中に VariableStatement があったか?
VariableStatement の中に Comma Operator があったか? 結局[1,2,3].map(v => (v += 2, v * v));のv += 2は副作用なの副作用じゃないの?あくしろ >>891
「代入=副作用」の認識だから、代入出来る事に気が付いても副作用で使えないと思ってるんだろ >>889
最後のplusじゃなくてplus(2)の間違い。すまんこ やっぱり変数宣言は特別なんじゃん
さっき勉強してから書けとか言ったやつ出てこいよ >>888
そもそも、その Expression だと
for (i = 0, j = 9; i <= 9; i++, j--) になるでしょ?
"var" という文字はどこから出てきたの? ■ このスレッドは過去ログ倉庫に格納されています