X



+ JavaScript の質問用スレッド vol.137 +
■ このスレッドは過去ログ倉庫に格納されています
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/
0799Name_Not_Found
垢版 |
2019/02/14(木) 19:26:27.83ID:???
jQueryなんぞとっくにマスターしててヒマだから新しい概念のフレームワークなど楽しく勉強してるというのにjQueryバカは「jQuery以外不要!勉強するな!俺が勉強してないのにムキーッ」
とスレチでつっかかってくるので遊んであげてるだけ。ムダだと思うのは自由だからお前が勉強しなきゃいいだけだろってw
なーに人の勉強内容にケチつけてんのかね。もうjQueryに学ぶことなんてないよw
0800Name_Not_Found
垢版 |
2019/02/14(木) 19:42:06.58ID:???
>>798
そりゃウェブアプリに限ればそうだろうよw
殆どがウェブサイトだからな
0801Name_Not_Found
垢版 |
2019/02/14(木) 19:42:45.40ID:???
>>799
そんな話してないぞ?

jQueryはオワコンじゃなくて
両方使いましょうって話をしてる
0802Name_Not_Found
垢版 |
2019/02/14(木) 19:45:37.79ID:???
DOMを管理するライブラリ/フレームワークは基本的に共存できない。
angular react vueなどのvDOM勢からしたらそこまでしてわざわざ軒先貸してあげるメリットがまるで無い。
0803Name_Not_Found
垢版 |
2019/02/14(木) 19:48:31.74ID:???
ようするにブラウザ標準のDOM APIとフレームワークは相性が悪いわけ
DOM APIを直接(またはjQueryなどのライブラリを使って)操作することを
禁止しているから
0804Name_Not_Found
垢版 |
2019/02/14(木) 19:52:48.24ID:???
そこでweb componentsですよ!
0805Name_Not_Found
垢版 |
2019/02/14(木) 20:11:02.90ID:???
web componentsが完成すれば、コンポーネント(≒HTMLタグ)を
プログラマが作ってウェブデザイナはそのHTMLタグを使う時代になる

コンポーネントは既存のHTMLタグの機能を拡張して動きをつけたものだが
汎用的なものであるためデザインは含まない(デフォルトがある程度)
デザインはCSSでやるという今と同じ流れ

コンポーネント自体はDOM APIを使って作るだろう。

じゃあjQueryは不要になるのか?というと、コンポーネント同士の連携で使われる

CSSでコンポーネントにデザインを、jQueryでコンポーネント同士の連携を。
そこにフレームワークは登場しない
0806Name_Not_Found
垢版 |
2019/02/14(木) 20:17:18.03ID:???
つける動きがもうコンポーネント作る時点で作ってあるんだから出番ねーよw
さすがに要素の移動程度ネイティブapiでやるわwww
0807Name_Not_Found
垢版 |
2019/02/14(木) 20:19:08.86ID:???
要素の移動ってなんだ?そんな事一言も言ってないが
0808Name_Not_Found
垢版 |
2019/02/14(木) 20:19:48.89ID:???
ごめん。じゃあ何一つ用ないわ。これでいいなw
0809Name_Not_Found
垢版 |
2019/02/14(木) 20:22:45.05ID:???
コンポーネント同士の連携が残ってるだろ
0810Name_Not_Found
垢版 |
2019/02/14(木) 20:23:00.35ID:???
rubyといいjQueryといい本尊が落ちぶれた信者は大変だな。
まぁ迷惑だから出ていけ。
0813Name_Not_Found
垢版 |
2019/02/15(金) 04:21:33.82ID:0lmiqgyP
parcel+react+flow←どんなイメージ?
0814Name_Not_Found
垢版 |
2019/02/15(金) 12:53:16.21ID:???
CSSで切り欠き部分まで一杯にコンテンツを表示しているときに
対象の要素の隠れた部分、もしくは切り欠き部分のマスクを取得、計算するにはどうしたら良いでしょうか?
0815Name_Not_Found
垢版 |
2019/02/15(金) 13:52:08.54ID:qVuKiR/W
要素のonclick属性と、click()のバインドは全く別物なのでしょうか?
上書きされることはないのでしょうか
https://jsfiddle.net/0a231k9s/
0816Name_Not_Found
垢版 |
2019/02/15(金) 14:59:50.09ID:???
onclick属性
addEventListener('click', e)
jQueryのclick(e)やon('click', e)
これら3つは別物と考えてok

jQueryは内部でaddEventListener使ってるけどイベントハンドラは独自管理
0817Name_Not_Found
垢版 |
2019/02/15(金) 15:04:23.10ID:qVuKiR/W
>>816
ありがとうございます!
0819Name_Not_Found
垢版 |
2019/02/16(土) 12:43:19.57ID:sXlAHJYP
無名関数の代わりにアロー関数を使う事はありますか?
互換性とthisのバインドの違いが怖くてビビって使えない
0821Name_Not_Found
垢版 |
2019/02/16(土) 13:41:46.91ID:sXlAHJYP
>>820
ありがとうございます
使えるように勉強します
0822Name_Not_Found
垢版 |
2019/02/16(土) 16:07:30.41ID:???
むしろthisが中と外で一致するので使いまくる
0824Name_Not_Found
垢版 |
2019/02/16(土) 18:44:09.81ID:???
すいません初心者の質問です
JSでは、C言語みたいに、1つの式しか書けない所で、「i++,j」みたいに書くことで
「i++という処理だけをして、その結果を捨てて、そこに入る値としてはjを使う」
という文法ってあるんでしょうか?
ちなみにこの文法のことをC言語で正式に何と呼ぶのか分からないので
Javascriptにこれがあるかどうかもうまく調べられないという状況です
0827Name_Not_Found
垢版 |
2019/02/16(土) 19:44:46.47ID:???
カンマ演算子を好んで使う職業プログラマなんておらんだろ
関数型云々とか関係ない
0828Name_Not_Found
垢版 |
2019/02/16(土) 19:46:30.38ID:???
コンマ演算子
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ではコンマ演算子と表記されている。
0830Name_Not_Found
垢版 |
2019/02/16(土) 19:54:11.76ID:???
プロのグラマーってちょっとエロい
0831Name_Not_Found
垢版 |
2019/02/16(土) 19:54:13.09ID:???
プロのグラマーってちょっとエロい
0832Name_Not_Found
垢版 |
2019/02/16(土) 20:17:23.51ID:???
>>826
積極的に使うわけではないが、一つの文にしたい時には使う
0833Name_Not_Found
垢版 |
2019/02/16(土) 20:23:49.65ID:???
アロー関数の略式で使うことあるし、関数型云々は関係ないな
0834Name_Not_Found
垢版 |
2019/02/16(土) 20:43:54.26ID:???
副作用嫌う関数型主義者がA,BでAには副作用しか期待できないカンマ演算子を許すはずがない
0835Name_Not_Found
垢版 |
2019/02/16(土) 21:28:25.73ID:???
カンマ演算子を使う事が副作用のトリガーではない
0836Name_Not_Found
垢版 |
2019/02/16(土) 21:47:11.28ID:???
皆さんありがとうございます。
カンマ演算子と言うんですね。そしてjsにもあると。
大変勉強になりました。
0837Name_Not_Found
垢版 |
2019/02/16(土) 22:14:21.54ID:???
>>835
> カンマ演算子を使う事が副作用のトリガーではない

正しい。
が、A,BでAの部分で副作用を使わない場合はAの部分は全くなにもしないということ。それは単にBと書くことと同じである。
A,Bと書くということは、普通はAの部分で何か処理をさせる。
その場合その処理とは副作用以外あり得ない。
別に一般の言語では普通のことだが関数型信者は許せないのである。
0838Name_Not_Found
垢版 |
2019/02/16(土) 22:18:42.25ID:???
>>837
> その場合その処理とは副作用以外あり得ない。
なぜ?
0839Name_Not_Found
垢版 |
2019/02/16(土) 22:26:53.33ID:???
>>837
> が、A,BでAの部分で副作用を使わない場合はAの部分は全くなにもしないということ。それは単にBと書くことと同じである。

「副作用を伴わない=何もしない」って本気でそう思ってるのか...
返り値に影響する処理なら何もしてないわけではないだろうに
0840Name_Not_Found
垢版 |
2019/02/16(土) 22:39:04.01ID:???
A,BでAが帰り値に影響を与えるということは、すなわちAの部分は副作用を持つ。よく考えてみるんだな。
例:
var a;
var b = (a = 1, a + 2);

悪いとは言ってない。普通だ。
これを悪いと考えるのが関数型信者なのだ。
0841Name_Not_Found
垢版 |
2019/02/16(土) 22:50:31.02ID:???
副作用を伴わない関数↓
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に期待できるのは副作用のみである。

だからなんだ?なんでもない。ただそれが関数型信者は許せないのである。
0842Name_Not_Found
垢版 |
2019/02/16(土) 22:59:31.45ID:???
CPUに計算はさせてんじゃん。捨てられる無駄な計算をw
0843Name_Not_Found
垢版 |
2019/02/16(土) 23:00:53.56ID:???
>>840
やはり、ロジックがおかしい
再考を推奨する
[1,2,3].map(v => (v += 2, v * v)); // [9, 16, 25]

>>841
変数名からして汚いコードだな...
0844Name_Not_Found
垢版 |
2019/02/16(土) 23:07:20.22ID:???
>>843
オーケーオーケー、つまりあなたは
v += 2
の部分が副作用じゃないと言いたいんだな?
そっかぁそうだったのかぁ…
やっぱりwikipediaは信用できないなぁw

https://ja.m.wikipedia.org/wiki/副作用_(プログラム)
プログラミングにおける副作用(ふくさよう)とは、ある機能がコンピュータの(論理的な)状態を変化させ、それ以降で得られる結果に影響を与えることをいう。代表的な例は変数への値の代入である。
0845Name_Not_Found
垢版 |
2019/02/16(土) 23:12:41.93ID:???
副作用が何かも知らないやつが突っかかってんのか
知らないなら黙ってりゃいいのに
0847Name_Not_Found
垢版 |
2019/02/16(土) 23:21:48.35ID:???
>>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の条件を満たしており、他のいかなるスコープの変数にも影響を与えないとしても、前者は副作用があるのだな?
0848Name_Not_Found
垢版 |
2019/02/16(土) 23:25:03.72ID:???
>>847
A, Bと書くとき、Aに期待できるのは副作用のみである。

何か文句ありますか?以上。
0849Name_Not_Found
垢版 |
2019/02/16(土) 23:27:43.70ID:???
>>848
副作用がないコードは既に説明した、といっておこう
0850Name_Not_Found
垢版 |
2019/02/16(土) 23:32:15.92ID:???
>>848
はい。文句あります。

a=foo(),b=bar(a),c=baz(b)
0851Name_Not_Found
垢版 |
2019/02/16(土) 23:36:15.55ID:???
どこが文句?副作用大好きなんだねとしか...
0852Name_Not_Found
垢版 |
2019/02/16(土) 23:37:15.15ID:???
>>844
偉そうな物言いは「破壊的代入」で説明されている部分を理解してからにしてくれませんかね
0853Name_Not_Found
垢版 |
2019/02/16(土) 23:43:20.30ID:???
>>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
となる。ここに副作用はない
0854Name_Not_Found
垢版 |
2019/02/16(土) 23:44:13.78ID:???
ちなみに>>850を副作用なしで書くとこうなる。
const c = baz(bar(foo()));

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

まあfoo, bar, bazの中で副作用使ってるかどうかまでは関知しないが。
0855Name_Not_Found
垢版 |
2019/02/16(土) 23:45:57.18ID:???
> ちなみに>>850を副作用なしで書くとこうなる。
> const c = baz(bar(foo()));

ぷぷぷw

あれあれ?もしかして変数に代入したら
それは副作用だって思ってんの?
0856Name_Not_Found
垢版 |
2019/02/16(土) 23:46:26.59ID:???
「変数代入=副作用有」はネタじゃなくて本気だったんだな…
0857Name_Not_Found
垢版 |
2019/02/16(土) 23:47:33.92ID:???
ミュータブルと副作用の違いもわかってないっぽいし、律儀につき合うこともないと思うが…みんな真面目だな
0858Name_Not_Found
垢版 |
2019/02/16(土) 23:51:44.85ID:???
以下の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;
}
0859Name_Not_Found
垢版 |
2019/02/16(土) 23:53:03.84ID:???
ミュータブル以前の問題で「代表的な例は変数への値の代入」の説明を見て、反射的に脳内回路が出来上がっただけじゃないかね
説明の一部分だけ読んで早合点するやつは、最近珍しくない
0860Name_Not_Found
垢版 |
2019/02/16(土) 23:55:16.16ID:j33hsCXu
>>857
いや真面目なんじゃなくて
遊んでるだけだと思うw
0861Name_Not_Found
垢版 |
2019/02/16(土) 23:56:03.71ID:???
>>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で宣言済みか、あるいは宣言なしのグローバルかに関わらず、である。
0862Name_Not_Found
垢版 |
2019/02/16(土) 23:56:41.52ID:???
>>859
そんな高度(?)なこと考えてないよ。
単に A, B で Aの部分で代入ができることに気づいてないマヌケってだけ

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

じゃあ、副作用の内容を言ってください
0865Name_Not_Found
垢版 |
2019/02/16(土) 23:58:35.96ID:???
だから代入は副作用だって。
JSは副作用書けるしよく使うというだけの話だろ
0866Name_Not_Found
垢版 |
2019/02/16(土) 23:59:17.76ID:???
> だから代入は副作用だって

それだと純粋関数型言語であるHeskellにある代入(正確には束縛)
をどう説明すんの?
0867Name_Not_Found
垢版 |
2019/02/17(日) 00:00:20.87ID:???
>>866
自分で書いてんじゃん。
Haskellに代入はない。束縛のみ。
0868Name_Not_Found
垢版 |
2019/02/17(日) 00:01:32.78ID:???
const a=1, b=2, c=3 って書いたら
ちゃんとbもcもconstになるな。

ってことは
> const a = foo(), b = bar(a), c = baz(b);
は再代入できないから完全に副作用なしだ
0870Name_Not_Found
垢版 |
2019/02/17(日) 00:02:01.52ID:???
>>867
今は束縛かどうかじゃなくて、副作用があるかどうかです。

で、副作用あんの?
0872Name_Not_Found
垢版 |
2019/02/17(日) 00:02:44.40ID:???
JavaScrptのconstへの代入は
値を変更できないから束縛相当になるよ

つまりこれは完全に副作用がないということ
> const a = foo(), b = bar(a), c = baz(b);
0874Name_Not_Found
垢版 |
2019/02/17(日) 00:03:23.31ID:???
カンマ演算子使うことと、副作用にはな〜んも関係ないってこったな
0875Name_Not_Found
垢版 |
2019/02/17(日) 00:04:14.07ID:TDJ/uZqY
日本語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.
とかあって分かりやすいね
0876Name_Not_Found
垢版 |
2019/02/17(日) 00:04:27.03ID:???
結論としてはこれ

> 単に A, B で Aの部分で代入ができることに気づいてないマヌケってだけ
0878Name_Not_Found
垢版 |
2019/02/17(日) 00:05:20.43ID:???
constへの代入なら副作用はない

> const a = foo(), b = bar(a), c = baz(b);
0879Name_Not_Found
垢版 |
2019/02/17(日) 00:05:20.95ID:???
>>862
> for(int a=1, b=2, i=0, i < 10; i++)
C言語は知らないが、JavaScriptでは int を let に直したとして、カンマ演算子ではないぞ
0882Name_Not_Found
垢版 |
2019/02/17(日) 00:07:22.10ID:???
変数宣言時が特別扱いなんでしょ?
0884Name_Not_Found
垢版 |
2019/02/17(日) 00:12:44.56ID:???
じゃ[1,2,3].map(v => (v += 2, v * v));
も、[1,2,3].map(v => (const w = v + 2, w * w));って書けばいいな!
あ、あれ?(TдT)
0887Name_Not_Found
垢版 |
2019/02/17(日) 00:18:15.34ID:???
変数も代入も言語ごとに原理が異なるわけで、一律に「代入=副作用有」と考えるのが間違いの元
0888Name_Not_Found
垢版 |
2019/02/17(日) 00:25:09.05ID:???
>>885
for(Expression; Expression; Expression)Statement

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

forのExpressionにはカンマ演算子が使えることを確認しました。
やはりカンマ演算子ですね
0889Name_Not_Found
垢版 |
2019/02/17(日) 00:25:20.81ID:???
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));

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

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

↑に対して
単に A, B で Aの部分で代入ができることに気づいてないマヌケってだけ
0894Name_Not_Found
垢版 |
2019/02/17(日) 00:31:56.14ID:???
>>888
> for(var VariableDeclarationList;Expressionopt;Expressionopt)Statement

ここは読んだか?
Expression の中に VariableStatement があったか?
VariableStatement の中に Comma Operator があったか?
0895Name_Not_Found
垢版 |
2019/02/17(日) 00:32:41.29ID:???
結局[1,2,3].map(v => (v += 2, v * v));のv += 2は副作用なの副作用じゃないの?あくしろ
0896Name_Not_Found
垢版 |
2019/02/17(日) 00:32:53.83ID:???
>>891
「代入=副作用」の認識だから、代入出来る事に気が付いても副作用で使えないと思ってるんだろ
0897Name_Not_Found
垢版 |
2019/02/17(日) 00:33:52.74ID:???
>>889
最後のplusじゃなくてplus(2)の間違い。すまんこ
0898Name_Not_Found
垢版 |
2019/02/17(日) 00:34:14.04ID:???
やっぱり変数宣言は特別なんじゃん
さっき勉強してから書けとか言ったやつ出てこいよ
0899Name_Not_Found
垢版 |
2019/02/17(日) 00:35:24.38ID:???
>>888
そもそも、その Expression だと
for (i = 0, j = 9; i <= 9; i++, j--) になるでしょ?
"var" という文字はどこから出てきたの?
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況