トップページ⇒tech
1002コメント464KB

+ JavaScript(ECMAScript)質問用スレッド vol.122 + [無断転載禁止]©5ch.io

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2016/08/29(月) 01:23:24.09ID:MUTWRWKo
プログラマ板の趣旨にあわせてブラウザ限定ではなくサーバーサイドJavaScriptや
トランスパイラなどの関連技術の話題も取り扱うように変わりました。

ECMAScriptの言語仕様の話題。最新ECMAScriptによるモダンな書き方、Promiseやasync/awaitを
使った非同期プログラミング。ES2015、2016、2017等の最新ECMAScriptをブラウザで今すぐ使う方法、
ビルド環境やbowerやnodeのパッケージを使う方法等、モダンなJavaScript環境についての幅広い話をしましょう。

ECMAScript対応実行環境一覧(ブラウザやbabelを含む)
http://kangax.github.io/compat-table/es5/
http://kangax.github.io/compat-table/es6/ (= es2015)
http://kangax.github.io/compat-table/es2016plus/
http://kangax.github.io/compat-table/esnext/

JavaScriptとは?
もともとMozillaの前身のNetscapeが作った言語であり本来のJavaScriptはFirefoxの実装のみです。
JavaScriptの正式な仕様名はECMAScriptです。ですが一般に使われているとおり
ChromeやEdgeで使う言語もJavaScriptとしてこのスレでは扱います。
Firefox等のJavaScript実装は最新のECMAScriptに準拠しています。

※DOMはブラウザが提供しているものでありJavaScript(ECMAScript)の範囲外です。
なのでDOMを使ったプログラミングは原則としてこのスレの対象外です。
DOMはwindowオブジェクト(ブラウザのホストオブジェクト)経由で
参照するもので、window自体、window.document、window.Workerなどです。
これに関する話題はWeb制作板の下記のスレに移動してください。

+ JavaScript & jQuery 質問用スレッド vol.7 + [無断転載禁止]©2ch.net
http://echo.2ch.net/test/read.cgi/hp/1467906819/
+ JavaScript の質問用スレッド vol.130 + [無断転載禁止]©2ch.net
http://echo.2ch.net/test/read.cgi/hp/1463395557/

前スレ + JavaScript の質問用スレッド vol.121 + [無断転載禁止]©2ch.net
http://echo.2ch.net/test/read.cgi/tech/1468158373/
0652デフォルトの名無しさん2016/10/29(土) 14:47:07.98ID:z8URZLOb
>>651
alert(0.49999999999999999); // 0.5

問題外
0653デフォルトの名無しさん2016/10/29(土) 15:25:53.31ID:cEJXxPE7
>>651
jsfiddle.netで実行した結果を上げる。

alert(0.49999999999999999+0.5); // 1
alert(0.49+0.5); // 0.99
alert(0.499+0.5); // 0.999
alert(0.4999+0.5); // 0.9999
alert(0.49999+0.5); // 0.9999899999999999
alert(0.499999+0.5); // 0.9999990000000001

この環境の精度では、小数点以下四桁迄なら大丈夫になる。

”小数点第一位までしかない1以下の小数を四捨五入して1か0にする方法を教えてください”
なので、「小数点以下二桁は無い」事になる。
処理手順は、0.5を足して小数部分を捨てれば良い。
0654デフォルトの名無しさん2016/10/29(土) 18:07:27.02ID:O/3wAc5r
いや四捨五入する関数があるのに何でわざわざ計算してから切り捨てとかしなきゃいけないん?
0655デフォルトの名無しさん2016/10/29(土) 18:16:09.69ID:P+i+TDJ5
>>647
マイナスの時に想定外の動作
0656デフォルトの名無しさん2016/10/29(土) 18:55:02.99ID:Lu2qC+Nv
まさに>>654のいう通り
Math.floorを優先する理由はない
0657デフォルトの名無しさん2016/10/29(土) 19:15:01.21ID:mMTmoVUB
そもそも四捨五入する理由はない
欲しがりません勝つまでは
我慢しろ
0658デフォルトの名無しさん2016/10/29(土) 19:27:12.02ID:Lu2qC+Nv
四捨五入は質問(>>645)の要件なのでどう考えても必要
0659デフォルトの名無しさん2016/10/29(土) 19:52:25.39ID:cEJXxPE7
>>655
コードにする以前の問題。
入力で認めていれば、エラー対応が必要だし
入力で処理に影響する情報を排除すればそのままで済む。

そもそもマイナス扱う処理で四捨五入使うかな?
0660デフォルトの名無しさん2016/10/29(土) 19:53:28.10ID:68KH7Ulz
マイナスのときにどっちに寄せたいかじゃないの?
-0.6を四捨五入でどっちにしたいか。
roundで0にできたっけ?
0661デフォルトの名無しさん2016/10/29(土) 19:57:05.98ID:eSvC8hNl
> 小数点第一位までしかない1以下の小数を四捨五入して1か0にする方法を教えてください
小数点第一位までしかないんだから
Math.round() で解決だろ

バカ
0662デフォルトの名無しさん2016/10/29(土) 20:06:28.52ID:JHScm7pH
ビット & なら Math 演算も不要
( (n) * 2) & 1
n が数でなくとも 0 か 1 になるが
0663デフォルトの名無しさん2016/10/29(土) 20:37:58.28ID:mNGjlCUC
ビット演算は32bitなのが問題
速度を稼ぐために制限付きを承知で使うならいいだろうが
0664デフォルトの名無しさん2016/10/30(日) 01:00:03.39ID:O7t7tgSU
>>659
負の場合、例えば-20000.4は
> 小数点第一位までしかない1以下の小数
をみたすので、エラーでは無い
> 四捨五入して1か0にするには
四捨五入する桁を可変にすれば良いのかな?
0665デフォルトの名無しさん2016/10/30(日) 05:11:47.90ID:hqgegRgF
>>663
ビット演算が速度を稼げるという根拠は?
例えば直近のV8 nightlyのアセンブラで書き直させたBuiltin_MathRoundingOperationよりも速いと言えるの?
結局無駄なf64<->i32キャストが発生するし、実際は速くないよ
速く使おうと思ったらUSE_ASM_Context内や、よっぽど変数の扱いを気を付けて
キャストが全体として起こらないようにしなければならない
0666デフォルトの名無しさん2016/10/30(日) 05:55:23.89ID:h7Os3ze3
変数の扱いを気を付けてキャストが全体として起こらないようにすると
ビット演算は速度を稼げると
>>665は申しております。
0667デフォルトの名無しさん2016/10/30(日) 10:21:13.83ID:UrnMpVuD
小数一桁の数値を丸めるだけのことで何揉めてるの?
0668デフォルトの名無しさん2016/10/30(日) 10:28:59.39ID:TSDZ4OFC
1/10が0.1になるのがキモイです
普通0じゃないですか?
1.0/10なら0.1ですが
0669デフォルトの名無しさん2016/10/30(日) 11:32:50.61ID:Z+vVaA9C
>>667
要求仕様に対する、解析能力の確認ですね。
0670デフォルトの名無しさん2016/10/30(日) 12:21:33.43ID:dH+/za6/
>>668
https://ja.wikipedia.org/wiki/IEEE_754
0671デフォルトの名無しさん2016/10/30(日) 12:26:08.71ID:TSDZ4OFC
>>670
javaの1/10は出来ないの?
切り捨てたり切り上げたり面倒なんだけど
0672デフォルトの名無しさん2016/10/30(日) 12:39:39.62ID:dH+/za6/
>>671
出来ない
他言語の常識を持ち込むのがナンセンス
0673デフォルトの名無しさん2016/10/30(日) 12:42:33.00ID:TSDZ4OFC
>>672
mjky
0674デフォルトの名無しさん2016/10/30(日) 16:50:23.32ID:v2s+0v0Z
>>673
Math.floor(1/10); であなたの目的は達成できるが、数値演算をJavaと同じにするのは無理
0675デフォルトの名無しさん2016/10/30(日) 17:02:25.81ID:TSDZ4OFC
>>674
負数もそれでいける?
負数だと絶対値が切り捨てで増えて、切り上げで減るとか聞いたけど
0676デフォルトの名無しさん2016/10/30(日) 21:42:24.67ID:v2s+0v0Z
>>675
やってみれば分かることをなぜ聞くかな
試してから聞いてくれ
0677デフォルトの名無しさん2016/10/31(月) 03:18:16.89ID:vSxBS38U
JavaScriptでPOJO的なクラスを宣言することの存在意義ってありますでしょうか?

例えば、何かしらで永続化するとして
class Person {
 constructor(name, age);
}

const p = new Person('あいうえお', 20);
// WebStorage?で永続化してもとに戻す。ここではJSONで
const json = JSON.stringfy(p);
const p1 = JSON.parse(json);

p1でコード補完なんて効くのか??
JavaScriptでPOJOクラスみたいなものを宣言する存在意義がわかりません。教えて下さい。
0678デフォルトの名無しさん2016/10/31(月) 04:43:21.97ID:lofvnrlW
プロトタイプを持たないオブジェクトを作りたいのならクラスを使わない方がいい
JSON出し入れした場合などはプロトタイプが削除されどうせinstanceof等機能しないのだから。
お作法的にはcreatePersonという関数にする

まあクラスでもとんでもなくいけないということはない
それでわかりやすくなるというのならね
0679デフォルトの名無しさん2016/10/31(月) 05:10:17.86ID:vSxBS38U
>JSON出し入れした場合などはプロトタイプが削除されどうせinstanceof等機能しないのだから。
ですよね。

>まあクラスでもとんでもなくいけないということはない
>それでわかりやすくなるというのならね
デシアライズした後はあんまわかりやすくならなさそうだったので質問してみした。

ありがとうございます。
0680デフォルトの名無しさん2016/10/31(月) 06:43:17.85ID:xWfuY90D
>>677
POJOの意味をわかってないねw

https://ja.wikipedia.org/wiki/Plain_Old_Java_Object より

> POJOの概念は、明らかにPOJOという用語より前から存在する。なぜなら、
> オブジェクトクラスの自然なありさまとは、何ら特別なものではないからである。
> この用語の功績は、何らかのフレームワークを使う利点がその複雑さを補って
> あまりあるかどうかということを開発者に考えさせるという点にある。
> シンプルな設計の方が優れている場合もあるということを思い出させる明確な用語がなくては、
> 複雑なフレームワークが十分な理由のないままシステムアーキテクチャに含まれてしまいやすい。
> POJOによる設計が一般的になるにつれて、大規模フレームワークの機能の一部はPOJOでも
> 実現できることが明らかになってきており、実際に必要な機能領域に対する選択肢は増えている。
> HibernateとSpringがその例である。

意味わかる? POJOっていうのは単なるクラス。フレームワークとかのクラスを継承しない
単なるクラス。それがシンプルで良いという考え方から生まれた用語。

JavaScriptでも同じ。単なるクラスがシンプルで良い。
wikipediaに書いてあるように、特別なものじゃないんだが?

永続化? 補完? そんなものPOJOの意義とは全く関係無い。
0681デフォルトの名無しさん2016/10/31(月) 07:43:46.18ID:vSxBS38U
ありがとうございます。確かにPOJOの意味をしっかり理解してなく
ただシンプルぐらいの感覚で使ってたんですが、
ただ聞きたかったのは「POJOの存在意義」ではなく、
永続化するシンプルなクラスの「クラス宣言」をする存在意義をJavaScriptで知りたかったんです。
実際JavaScriptにはクラスというものはなくて
class Person {
 constructor(name, age);
はただのシンタックスシュガーらしいのですが、わざわざこんな宣言するメリットあるのかなと
それがが聞きたかったのです。
つまり、直接
var p = { };で作ってもいいんじゃないのかと。
0682デフォルトの名無しさん2016/10/31(月) 07:47:51.97ID:vSxBS38U
つか、「存在」ってのつけたのがまずかったですね。
存在ってつけたからPOJOの存在意義って風に。すみまんせん。日本語がおかしかったです。
>永続化するシンプルなクラスの「クラス宣言」をする意義
ただの意義でした。
0683デフォルトの名無しさん2016/10/31(月) 18:41:59.71ID:lofvnrlW
「クラス」って言うのはね、ただのオブジェクト指向をより良く扱うための概念なのよ。
だから、シンタックスシュガーもクソもなくてJSに「クラス」という概念はあるし、
素朴なプロトタイプベースで何もかもこなすのは非効率だから、昔から何らかのクラスシステムが使われてきた。
ただオブジェクト指向のやり方が「クラス」に縛られていないというだけ。
そして標準class構文は1つのより良いクラスシステムを提供するもの。

クラスから継承を取ったら何が残るかと言うと、それは見た目だよ。
createPersonのような関数で済ますのが普通だが、
もし他にそういった物がまだなく、全てクラススタイルで記述されていたらどうだ?
意味はなくとも意義がある。

>>var p = { };で作ってもいいんじゃないのかと
それは全体的な状況による。
例えばclass構文ガチガチのスタイル縛りの設計に無遠慮入れ込む事はできない。
0684デフォルトの名無しさん2016/10/31(月) 18:44:45.95ID:pApy3Eby
var p={};←タプル
class Hoge←OOPのクラス
として使ってる
0685デフォルトの名無しさん2016/10/31(月) 21:26:05.75ID:xWfuY90D
>>682
JavaScriptに限らず言語の文法っていうのは
可読性を上げるために作られているんだよ。

そして可読性を上げる方法の一つが、コードの中から読まなければ
いけないコードの量を減らすこと。

一定のパターンに対して名前をつけてその名前を覚えてしまうことで
読まなければいけない量を減らすことができる。デザインパターンもその一つだけど文法も同じ。
シンタックスシュガーも読まなければいけなかったコードを
短い言葉で置き換えてそれを覚えてしまうことで可読性を上げることにつながってる。
(とは言えなんでも覚えてしまうのは不可能だから、覚える価値があるものだけに絞るべき。
例えばプロジェクト固有の関数は覚える価値が少ない。言語仕様はどこでも使える知識だから覚える価値がある)

また文法っていうのは、汎用的な命令だたものを専用的な命令に置き換えることが
できるように進化してきている。例えばgotoはあちこちに飛ぶことができるものだが、
これをより専用化してbreakやretrunやthrowなどができた。
これはgotoだけでは色んな意味があるから何のために使っているのかわかりにくいが
専用的なbreakであればループを途中で抜けるんだろうなってことがわかるから。

JavaScriptはclassが無くても作れていたが、だが人間は関数とクラスを区別していた人が多かった。
だからその人間の感覚に近づけることが可読性向上につながるわけ。
可読性の問題なのだから無くてもできるのは当たり前。

var p = { }; これだとただのハッシュなのかクラスなのか、色んな使い方ができるから
これだけ見てもわかりづらいだろ? 使っている箇所を読まなければ分からない。

class Personであればnewして使うんだろうなってことが明確になる。
読まなくて済むわけだよ。これが可読性という話。
0686デフォルトの名無しさん2016/10/31(月) 21:29:41.12ID:xWfuY90D
それと可読性というのは全体のコード量にも依存する。
class Personの方がわかりやすいが、全体のコードが数十行程度なら
そこまでする必要はない。

だからコードが短いうちはvar p = {} で書いていても良い。
だけどコードが増えたときには必ずclass Personに変更しなければいけない。

これを放っておけば、犬小屋を作るやり方で一軒家を作るようなことになりかねない。
規模によって適切なやり方は違う。
0687デフォルトの名無しさん2016/10/31(月) 22:06:57.07ID:R+gJxrwJ
>>681
var p = { };は当然に
p instanceof Personがfalseになる
0688デフォルトの名無しさん2016/10/31(月) 22:14:03.50ID:vSxBS38U
色々ありがとうございます。いわゆるクラスベースのオブジェクト指向言語については
もうC++,Delphi,Java,C#と10年以上はずっと使ってきました。
で、今回プロトタイプベースと言われる
JavaScriptを使って本格的にプログラミングし始めたのですが、もちろん最初は
クラス宣言してどんどんクラスを量産してたんですが、今回、例えばSettingsクラスみたいな
シンプルなPOJO的で永続化するクラスを作ろうとしたときに、
デシアライズすると元のプロトタイプチェーン?みたいなものが失われるし、
実際動作させた場合、最初のクラス宣言した元のSettingsクラスのインスタンスは最初の1回だけ作成され
後は別のプロトタイプチェーンが失われた別のインスタンス?とでもいうのでしょうかが動くことになるので、
ん?とちょっと手が止まってしまって質問した次第です。
0689デフォルトの名無しさん2016/10/31(月) 22:22:26.57ID:vSxBS38U
まぁ、永続化後に元のプロトタイプチェーンが失われてinstanceofが機能しなくなりますが、
もちろん、クラス宣言があった方が、実際それ参照すれば元々どんな構造だったのか分かりやすいとは
もちろん思ってましたが、それを踏まえてJavaScriptの経験豊富な方たちは
どうしてるのかなと思って質問したわけです。

とりあえずはプロトタイプチェーンとか気にする必要ない用実装するので
クラス宣言する方向で行こうと思います。
0690デフォルトの名無しさん2016/10/31(月) 22:23:55.93ID:vSxBS38U
Setttingsクラスとかだとクラス宣言ないとどんな設定あるのか把握きついですしね。
0691デフォルトの名無しさん2016/10/31(月) 22:55:13.38ID:hNQh9muD
>>688
> デシアライズすると元のプロトタイプチェーン?みたいなものが失われるし、
> 実際動作させた場合、最初のクラス宣言した元のSettingsクラスのインスタンスは最初の1回だけ作成され
> 後は別のプロトタイプチェーンが失われた別のインスタンス?とでもいうのでしょうかが動くことになるので、
考え方がクラスベースで固定されてるのでプロトタイプチェーンをしっかり学ぶべきな気がする。
デシリアライズしたらプロトタイプ上のプロパティが失われるというが、実際にはシリアライズされた時には失われているのでは?
シリアライズが正常動作しているならそれはデシリアライズ処理がおかしいだけ。
最も、プロトタイプ上のプロパティを拾ってないだけな気もするが。
0692デフォルトの名無しさん2016/10/31(月) 23:08:27.14ID:xWfuY90D
>>688
永続化が問題なのか?クラスの話関係ないじゃん。

シリアライズっていうけどさ、やってるのはJSON文字列への変換だろ?
前提として関数等はJSON文字列に変換することはできない。

シリアライズされたデータの中に関数定義は含まれないので
関数定義とデータは別々に管理しなければならない。
ここまでは自明だよな?

あとはクラス定義(プロトタイプチェーン含む)をコードで作った上で
その中のデータのみをシリアライズ & デシリアライズする。
これがJSONオブジェクトを使った場合のやり方だろ?
0693デフォルトの名無しさん2016/10/31(月) 23:09:18.71ID:xWfuY90D
つーかクラスと永続化の話を切り離して考えろ!
0694デフォルトの名無しさん2016/10/31(月) 23:20:25.00ID:xWfuY90D
そもそも永続化の話ということで考えると、
お前それ本当に永続化したいと思ってんのか?って言いたくなるんだが。

何のために永続化が必要なんだ?
永続化なんてしないだろ。永続化しないもののために
わざわざ永続化のためのコードなんて書く意味ねーぞ?

Javaの話でも同じ。永続化しないものにSerializableなんて
やる必要ないぞ。何も考えずに無駄にコピペしてねーか?
0695デフォルトの名無しさん2016/10/31(月) 23:29:48.72ID:vSxBS38U
え?
永続化する必要あるから永続化しようとしてるのに・・
0696デフォルトの名無しさん2016/10/31(月) 23:48:32.48ID:VoAu6vx9
もう、JavaScriptやめて、Java使えよ

グダグダとくだらねぇこと語って
0697デフォルトの名無しさん2016/11/01(火) 03:03:10.88ID:lWEkG1Wt
「Try Haxe」ヘックスで、試してみ

AltJSのHaxeでは、ソースコードを文字列化して送っても、型が消えない。
大規模開発に向く
0698デフォルトの名無しさん2016/11/01(火) 08:40:03.75ID:MkSUKVBa
>>689
分かった分かった。
君とここの住人はクラスに対する考え方が違うから話が噛み合っているようで無かったみたいだ。

要するに、クラスベース言語では通常捨てオブジェクトを作るにもクラスを設計するしか無いので迷わないが、
JSではプレーンオブジェクトを扱いたい場合にどうしたら良いかという話でしょ?

それならわざわざクラスを設計する必要がないというのが一般的な話だ。
オブジェクトの型ごとに空のクラスを置くのは全くもってJS流ではない。

JSでは、オブジェクトはより自由で気軽なもの。
オブジェクトを作りたいというだけなら、リテラルを使う。

幾つも同じタイプのオブジェクトを生成したい場合関数にて生成するが、
そういった場合それらのオブジェクトに共通した操作を定義したい場合も多い。
ここで初めて出てくるのがクラスだ。

つまりクラスとは、オブジェクト生成に必須のものでは勿論無いし、
あくまでオブジェクト指向の上で構造化のプログラミングする中で出て来る
手法・ツールの一つという位置づけでしか無い。

よって話を戻すと、今回の場合Personクラスを作る必要はない。
というかJSを使いに取っては完全にあり得ない、考えたこともない思考なので、混乱が生じた。
作る必要はないというか、そのような事を考えるのが異常なレベル。
0699デフォルトの名無しさん2016/11/01(火) 10:02:53.69ID:JdgZau7x
またバベル君が狂い始めてるのか。
0700デフォルトの名無しさん2016/11/01(火) 21:13:39.04ID:iw2Pppzi
>>698
お前がJS流とかきめんなや。
クラスを使うかどうかは規模やどう使うか決まる。
言語で決まるわけじゃない。

一般的なクラスとして扱いたいならばクラスにした方がいい。
人間の感覚とコードをできる限り近づけるようにするべきだ。

>>699
呼んだ?w
0701デフォルトの名無しさん2016/11/01(火) 21:24:11.29ID:MkSUKVBa
>>700
いや、今話されてるのは言語で決まる類の話だ。
古き良きクラスベース言語では原則実態であるオブジェクトを作るには
雛形であるクラスを設計しなければならない。
しかしプロトタイプベースでもあるJSではその限りではない。
違いがあって当然。
0702デフォルトの名無しさん2016/11/01(火) 21:34:38.58ID:iw2Pppzi
>>701
なんで古い前提で話をしてるんだよw

新しいJavaScriptではclass構文が追加された。
当たり前だが気まぐれで追加されたわけじゃない。

これが必要とされたからだ。
であれば、どちらかと言えばclassを使うのが適切な場面では
classを使う方がいい。

プロトタイプベースから”改良"されてclass構文が追加されたんだよ。
0703デフォルトの名無しさん2016/11/01(火) 21:46:38.71ID:o4WGeuVh
アロー関数とクラス構文使わない奴は馬鹿と思う
アローのthisそのまま使えるのはチョー便利
長いfunction書かなくていいし
0704デフォルトの名無しさん2016/11/01(火) 22:07:12.64ID:x6lATtpW
誰に向かって言ってるの?
0705デフォルトの名無しさん2016/11/01(火) 22:10:49.88ID:iw2Pppzi
分割代入もなにげに便利だよな。
最初はあまり使わないかなとも思ったけど
関数の引数で分割代入とか目からうろこのテクニック
Promiseと組み合わせて使うとほんと便利
0706デフォルトの名無しさん2016/11/01(火) 22:20:38.57ID:MkSUKVBa
>>702
>>どちらかと言えばclassを使うのが適切な場面ではclassを使う方がいい
とは一体何と何を比較して物を言っているの?
もしかしてclass構文と従来の関数+prototypeを比較した話をしているの?

自分はそんな話は全くしていないんだけど。
オブジェクトリテラルは君も使うでしょ?
それが無い言語、シンプルな使い捨てオブジェクトでさえも
そのための使い捨てクラスを作って、newするのが基本な言語もある。
それとJSは違うという話をしてるんだけど。

それとプロトタイプベースから改良されてという意味も分からない。
今まではプロトタイプベースの皮を被った癖のあるクラスシステムしか用意されてなかった
プロトタイプベースはあくまで言語の縁の下でしかなく、
自由に触れられず結局中途半端なクラスシステムに縛られていた。

プロトタイプベースが真に開放され、インスタンスベースなプログラミングが出来るようになったのは
class構文が搭載されたのと同じES2015から。
つまり"改良"はプロトタイプベースからではなく、プロトタイプベースの皮をかぶった中途半端なクラスシステムから。
その壁に穴を開けて下のプロトタイプベースと、上のより良いクラスシステムを見通せるようにしたというのが"改良"だ。
0707デフォルトの名無しさん2016/11/03(木) 22:59:33.56ID:cb4Y2Yz9
つうか、jscript.netとかswfのes4とか、十数年前からみんなclassて書いてるよ。
0708デフォルトの名無しさん2016/11/04(金) 01:26:18.56ID:LmRSOsos
誰もclass構文の話はしていない
0709デフォルトの名無しさん2016/11/04(金) 19:37:01.89ID:eNDgRS9h
>>708
JavaScriptのスレで話す内容ではない。
0710デフォルトの名無しさん2016/11/04(金) 21:21:51.64ID:LmRSOsos
JSのプロトタイプベースに纏わる話は十分このスレの担当範囲だろうよ
0711デフォルトの名無しさん2016/11/07(月) 21:32:53.88ID:toRb2seg
だれかCancelTokenについて話さない?
Promise.prototype.cancelよりもどこがどう優れてるのかとか。
0712デフォルトの名無しさん2016/11/07(月) 22:10:09.38ID:883psKTk
せめてリンク貼れや
0713デフォルトの名無しさん2016/11/07(月) 22:35:42.50ID:toRb2seg
ほい
https://github.com/tc39/proposal-cancelable-promises
0714デフォルトの名無しさん2016/11/07(月) 22:46:11.29ID:883psKTk
> The cancel tokens of this proposal are heavily inspired by Kevin Smith's design sketch,
> which are in turn inspired by the .NET task cancelation architecture.
> They are discussed further, in much more detail, in "Cancel Tokens".

inspired by the .NET task cancelation architecture か
なら良さそうだな。
0715デフォルトの名無しさん2016/11/08(火) 07:34:19.94ID:Cn2WM8Zt
そう、これが違和感があるのって、taskのcancelationだからなんだよ。
キャンセルの仕組みを外に出した方が応用が効いて便利ってことは分かるけれど、
PromiseってあえてjQueryなどのDefferedと違って内部を外に出さないように設計したよね。

将来的には増やす案があったし、V8なんかは暫く独自機能残してたけど、立ち消えになったよね。
Promiseはあくまでいつか確定される値の抽象だからそんなの付けるべきでないって意見が強かったよね。

逆にそうだからこそ、キャンセルの仕組みを外に出したとも見れるけれど、
プロミスの状態で考えると、解決・棄却・その他は対等なので、
一つだけ操作・利用の仕組みが大きく違うのが違和感ある。
0716デフォルトの名無しさん2016/11/08(火) 09:02:08.41ID:le3Xpa4U
> PromiseってあえてjQueryなどのDefferedと違って内部を外に出さないように設計したよね。
というか、もともとキャンセルの仕組みもついでに処理途中の通知のシステムもないでしょ?

非同期処理をネストしないで書くための方法にとどめておくべきだよ。
asyncとawaitというシンタックスシュガーが使えない環境で
これらを使わずに同じように書くための仕組み。

それ以外は「タスク処理」をするためのフレームワークであって
Promiseとは別に作るべき。

> プロミスの状態で考えると、解決・棄却・その他は対等なので、
Promiseがやるのは順次処理(次の行へ進む)とエラー(例外)だけ
そもそもタスクとして考えるのがおかしい。

つーかついこの間たまたまタスク処理的なものを作ったけど
キャンセルとか状態の通知を追加するとPromiseとは呼べないものになったよ。
内部的にはFetch APIとかPromise使ってるんだけど、それを囲うための
タスク処理とそのタスクを管理する仕組みはイベントベースにせざるを得なかった。
Promiseでは無理
0717デフォルトの名無しさん2016/11/08(火) 09:41:38.26ID:le3Xpa4U
なんでタスク管理の仕組みがPromiseじゃ無理かって言うと独自のメソッドが必要になるから。

タスクを管理するためのメソッドは色々ある。
タスクの中止やタスクからの情報通知だけじゃなくて
タスクの一時停止や再開、タスク情報の設定
(例えばダウンローダーみたいなのであれば保存するファイル名の変更とか)

Promiseでは情報がPromiseオブジェクトしか返ってこない
例えばFetch APIはPromiseオブジェクトを返すが、これはFetchオブジェクトじゃない。
Fetchオブジェクトに対してcancelとか色々やるならわかるが、
Promiseにcancel生やすなら、Promiseが内部的にFetchオブジェクトのcancelに
処理を渡さなきゃいけない。他のメソッドも同様。

そしてPromiseにキャンセルがあると思いきや、イベント通知。
つまりFetch APIを例にすると進捗状況だね。その進捗状況のイベントハンドラは
Fetchオブジェクトを知ることができるべきだろうけど、じゃあイベントハンドラで
キャンセルしたいときは? 方やPromiseのcancel、方やFetchオブジェクトのcancelじゃわけがわからない。
イベントハンドラの中でPromiseオブジェクトを取得できるのも意味不明。

Promise内部やPromsieの引数にPromiseを生成したオブジェクトを参照できるようにする方法も考えられるけど
Promiseのチェーンは前の戻り値を引き継いでいけるという仕組みだから使い方がおかしい。

時間切れだからここまでにしておくけど、ようするにPromiseでタスク管理をしてはいけないという話
0718デフォルトの名無しさん2016/11/08(火) 09:46:21.72ID:le3Xpa4U
で、俺の意見としてはPromiseはこのままでいいから
別でタスク管理の仕組みを作れ。
タスク登録して優先順位とか並列実行とか
めんどくさかったわw
0719デフォルトの名無しさん2016/11/08(火) 10:58:01.33ID:Cn2WM8Zt
>>718
いや、君の意見は部分的にはもっともだよ。でも現実そうでないのがなんで?って話。

CancelTokenは、それ自体では完結してない。
あくまでPromiseに「解決」・「棄却」の2つの状態に更に「その他」を加えることが中核。
つまりPromiseが君の言うPromiseじゃなくなることまでは確定されてるのよ。

あくまでそのトリガーを、解決や棄却と同じ形でせずに、
外部からコントロール出来るようにするということでしかない。

だからもっと独立したTaskを作らなかったのが何で?って思うし、
Promiseを継承したCancellablePromiseでもなく、.cancelメソッドを生やすだけでもなく、
どうしてこういう今までのJSの流れと違う、ある意味中途半端で特殊な形にまとめたのかなって疑問。
0720デフォルトの名無しさん2016/11/08(火) 10:58:54.93ID:oVtTKQIX
ゴミ
0721デフォルトの名無しさん2016/11/08(火) 11:04:57.61ID:Cn2WM8Zt
だから自分が言いたいことを整理すると、
どうしてPromiseとTask管理のキャンセルの仕組みを悪魔合体させたのかということ。
そしてそれが幾らか便利なのは分かるが、
簡単に.cancalメソッドを付けたりするくらいでも多くの場合十分なのではないかということ。
0722デフォルトの名無しさん2016/11/08(火) 19:41:39.60ID:L5B8nS+2
classを定義したのですが、そのクラスのメソッド内のコールバックの中で
別のメソッドを呼び出したいのですがどうすればいいでしょうか??
class MyClass {

 method1();

 method2() {
  xhr.onreadystatechange = function() {
   method1を呼びたい。けど、this.method1じゃだめ
  }
 }

}
0723デフォルトの名無しさん2016/11/08(火) 19:54:23.01ID:nv3pE1Bb
>>722
var that = this; で別変数に入れておいて、xhr.onreadystatechange = function(){ that.method1(); } みたいに使う。
あるいは xhr.onreadystatechange = () => { this.method1(); } みたいにアロー関数を使う。
0724デフォルトの名無しさん2016/11/08(火) 20:02:58.32ID:L5B8nS+2
>var that = this; で別変数に入れておいて、xhr.onreadystatechange = function(){ that.method1(); } みたいに使う。
なるほど。this自体を別の変数に入れておけばよかったんですね・・
自分はvar method1 = this.method1
とメソッド自体を別変数に入れて呼び出してたんですけど、呼び出しは成功するっぽいのですが、
method1の内部でthisをmethod1() { thisほにゃらら }と参照するとthisが未定義になって困ってました。

>あるいは xhr.onreadystatechange = () => { this.method1(); } みたいにアロー関数を使う。
アロー関数は聞いた事ありませんでした。調べてみます。

ありがとうございます。
0725デフォルトの名無しさん2016/11/08(火) 20:36:55.73ID:oXq4xn77
ぶっちゃけstatechangeは滅多と使うものではない。
onload使え、もっと言うとfetch使え。
0726デフォルトの名無しさん2016/11/08(火) 21:22:58.34ID:L5B8nS+2
何が標準でどの資料みればいいのかわかりませんが、
onloadは非標準とか書いてあったので、onreadystatechange使ってました。
onload調べてみます。fetchはなんぞ?
0727デフォルトの名無しさん2016/11/08(火) 21:35:01.22ID:L5B8nS+2
FetchってXHRと全くの別物か。
0728デフォルトの名無しさん2016/11/08(火) 22:01:06.66ID:odPOKtVp
>>722
var that = this; は古い
handleEvent を使えばスマートに書ける
https://developer.mozilla.org/ja/docs/Web/API/EventTarget/addEventListener#The_value_of_this_within_the_handler
0729デフォルトの名無しさん2016/11/08(火) 22:13:14.01ID:L5B8nS+2
XHRのエラーハンドリングをまだほとんどしてなかったのですが、
onreadystatechangeだとエラーでstatusが0の時の処理とかあるので、
onloadとonerror使えばすっきりするってことですかね。
ということでonloadとonerrorに書き換えます。
0730デフォルトの名無しさん 転載ダメ©2ch.net2016/11/09(水) 06:22:28.44ID:br65i1Lj

板復帰(OK!:Gather .dat file OK:moving DAT 521 -> 520:Get subject.txt OK:Check subject.txt 521 -> 521:Overwrite OK)0.44, 0.42, 0.41
age subject:521 dat:520 rebuild OK!
0731デフォルトの名無しさん2016/11/09(水) 08:10:50.79ID:HRJGJTih
>>726
もし冗談でなく本当にonloadが非標準と書かれた情報が存在し、
それを見てしまったのなら今すぐに目ン玉を引っこ抜いて洗ったほうが良い。
それは5年以上前の情報だから、けして参考にしてはいけない。
死ぬぞ。
0732デフォルトの名無しさん2016/11/09(水) 14:41:13.38ID:SYPVDf2E
>>726
XHR
https://xhr.spec.whatwg.org/
Fetch
https://fetch.spec.whatwg.org/
0733デフォルトの名無しさん2016/11/11(金) 11:06:53.92ID:hqcaajAu
npm install yarnと
linuxのyumとかapt-getでいれるyarn
どっちを使えばいいんですか?
0734デフォルトの名無しさん2016/11/11(金) 21:39:29.00ID:ENznHnYU
ndenv、nodenv、nodebrewあたりを使ってるならnpmしか選択肢にならない
0735デフォルトの名無しさん2016/11/13(日) 16:04:40.73ID:QhlptiVm
Google翻訳が改善されたというニュースを皆見たと思うが、
これは我々の世界の英語が得意でない者にとって革命だ。
今までは訳すと読むだけで頭が痛くなるような奇妙な日本語が生成されていたが、
今では勉強に集中できる程度に精度が向上している。
0736デフォルトの名無しさん2016/11/13(日) 16:08:36.94ID:foNYoSMf
やったぜ
0737デフォルトの名無しさん2016/11/13(日) 16:32:58.01ID:jy2VGr1W
Promiseって、処理結果を外に出したり、外から値もらったりするときに
レキシカルバインドした変数を介さないといけなくてダサい
もっとカッチョ良い制御構文無いの?
0738デフォルトの名無しさん2016/11/13(日) 16:47:42.97ID:foNYoSMf
>>737
*function
0739デフォルトの名無しさん2016/11/13(日) 16:52:48.84ID:TWR6TIrT
>>737
それ使っても、Promiseが見えなくなるだけで、
「レキシカルバインドした変数」は同じだよな?
0740デフォルトの名無しさん2016/11/13(日) 21:18:16.74ID:nngvad4K
>>737
try-catch
0741デフォルトの名無しさん2016/11/13(日) 21:33:19.82ID:jy2VGr1W
thenのコールバックの戻り値がPromiseだと、新しいPromise作らないで、それを使うのか
配列に複数の値突っ込んでそれを持ち回す事にした

レキシカルバインドした変数に代入する方法では、書き込む方と読み出す方の同期を取るのが厄介
0742デフォルトの名無しさん2016/11/13(日) 21:51:23.69ID:TWR6TIrT
> 書き込む方と読み出す方の同期を取るのが厄介
シングルスレッドなのに何を言ってるのだろうか?
0743デフォルトの名無しさん2016/11/13(日) 23:47:53.73ID:jy2VGr1W
>>742
Promiseは非同期オブジェクトだから
それと同期してない奴が触ったときに処理が完了してるとは限らないんだな、これが
0744デフォルトの名無しさん2016/11/14(月) 00:34:40.39ID:UEPxPzue
>>743
Promiseは非同期処理を同期的に記述できるようにするものなんだが?
同期的に記述してるのに同期をとるのが厄介ってお前理解してないんじゃね?w
0745デフォルトの名無しさん2016/11/14(月) 00:47:56.56ID:8ZP1uHGR
>>743
それと同期してない奴というのはPromiseに組み込めないの?
0746デフォルトの名無しさん2016/11/14(月) 00:49:40.25ID:y8otP/4p
>>744
処理待ちしてる間に別の処理を差し込めるからバインドしたthisの内容が保証されないって言いたいんじゃね
0747デフォルトの名無しさん2016/11/14(月) 01:06:58.66ID:UEPxPzue
>>746
意味わからん。まあ一言言っておくと、保証されないわけがない。
0748デフォルトの名無しさん2016/11/14(月) 01:22:56.04ID:y8otP/4p
>>747
オブジェクトにデータ積んで行くイベントをPromiseで繋げて完了待ちしてる合間に、
ユーザの操作で別イベントが発火したら未完了のデータに触れちゃうし書き換えられもするだろ?
0749デフォルトの名無しさん2016/11/14(月) 01:24:49.33ID:Gl21TU7L
let g;
(new Promise())
.then()
.then(v => { g = v;}) // <==== (1)
.catch();

console.log(g); // <===== (2)

(2)を実行する時に(1)が完了している事は保証されていない
0750デフォルトの名無しさん2016/11/14(月) 01:38:40.81ID:UEPxPzue
>>749
> (2)を実行する時に(1)が完了している事は保証されていない

???

その場合は、(2)を実行する時に(1)が完了していないことが事が保証されてる

Promiseを実行して処理を非同期にした時点で、後回しにされるんだよ。
JavaScriptはシングルスレッドなんだから後回しになった処理が先に終わることはない。
他に割り込まれること無く(2)が実行される。
0751デフォルトの名無しさん2016/11/14(月) 01:40:04.94ID:UEPxPzue
>>748
それはPromise関係ないな。レキシカルバインドした変数も関係ないな。

二つのボタンがあったとして、先にクリックしたほうが
先に変数にデータを入れられるってだけの話だ。
■ このスレッドは過去ログ倉庫に格納されています