JavaScript情報交換所(プログラミング既習者専用) [無断転載禁止]©2ch.net

1デフォルトの名無しさん
垢版 |
2015/12/07(月) 07:26:33.87ID:NYLGCW0V
実際にJavaScriptを書いている人の情報交換所です。
プログラミング既習者専用です。初心者の方はご遠慮下さい。
玄人の方、歓迎致します。
2016/06/16(木) 15:16:35.80ID:oMjTOMdB
他人を理解できないってのは悲しいね
2016/06/18(土) 01:00:30.57ID:HfDVf1Az
>>243
人数自体はそんなに大したことはない。
おかしな奴の割合が異常に高いんだよ。
Webがホームということもあり、未熟な奴が平気で情報発信()している感もあるが。
http://www.tiobe.com/tiobe_index
http://spectrum.ieee.org/computing/software/the-2015-top-ten-programming-languages
http://pypl.github.io/PYPL.html
2016/06/18(土) 05:23:04.56ID:bYpIs91z
マンセーしたら未熟者扱い?
エキスパートな俺様は苦しんでるのに許せない間違っているってことだろうか
それとも辛い経験豊富で批判的な俺様カッケーって勘違いアピール?
傍から見るとひねくれ者の妬みにしか見えないが……
2016/06/18(土) 14:06:50.57ID:P96CWXJR
観測範囲の問題
JavaScriptに限らず、おかしな人はどこにでもいる
このスレの>>1は相当な変わり者だったようだが
2016/06/19(日) 04:58:43.41ID:pwKRdbbJ
おかしくない人って何よ
2016/06/19(日) 10:12:00.06ID:0NV3J/pF
>>245
Google で検索されたキーワード辺りで指標作った方が良さげな気がする。
2016/06/19(日) 12:28:35.73ID:XPavHURr
ここは>>1を含めて俺様主義の人が常駐してるのでまともな意見交換は出来んよ
始めは冷静でも、少し意見の食い違う人が現れただけでただの「主張の押しつけ合い」に発展する
意見交換するなら「そんな考え方もあるのか」ぐらいに自分の立場を引いて見つめる客観性が必要だが、彼は否定にかかるだけで相手をやりこめないと満足しないからな
2016/06/19(日) 15:16:34.64ID:pwKRdbbJ
俺もお前も仙人や神様じゃなく凡人なのだから、性質に割り振れる度合いは限られてる。
結局思考停止の傲慢くんも、視野無限の優柔不断くんも、同じくらい悪い議論しかできない。
その中間であっても、両者の悪いところを半々持つので、同じくらい悪い議論しかできない。
つまり無理難題夢物語ということ。「こんな議論もあるのか」ぐらい許容的になってもよかでは?
2016/06/19(日) 17:29:39.15ID:+1vne4gn
そうやって他人の人格否定する辺りがまともな議論が成立しない理由なんだよな
http://d.hatena.ne.jp/takerunba/touch/20081028/p1
2016/06/19(日) 19:27:30.52ID:fmRoj+h3
そこで言う「まともな議論」とやらをここでする必要が有るのかい?
仕事でもあるまいし、自己主張のたまり場でもええんやないの?
2016/06/19(日) 19:36:59.62ID:J/2rkjpj
ここは電波を黙らせる方法がないのだから基本は自己主張のたまり場にしかならんよ
その状態で有益な議論に出来るかは当事者次第でしかない
2016/06/19(日) 20:13:29.92ID:fmRoj+h3
まあぶっちゃけ単純に「聞き手」不足なだけなんだけどね
2016/06/19(日) 20:36:57.86ID:J/2rkjpj
そうか?なら語って、どうぞ。
なおセミコロンについて語られても困りますので悪しからず。
2016/06/19(日) 22:34:40.11ID:YTnkZ+TT
自己主張の溜まり場なら「情報交換所」なんてタイトルを付けなければいいのにな
次スレは「JavaScript自己主張の溜まり場」に改名すればいい
2016/06/19(日) 22:50:20.08ID:J/2rkjpj
単発にはキチガイしかいないことの再証明乙
2016/06/19(日) 22:55:12.64ID:YTnkZ+TT
ID:J/2rkjpj
自己主張の溜まり場で有益な議論が出来る訳なかろう
キチガイといっている時点でおまえにはその気が全くないのだろうが
2016/06/19(日) 23:05:07.79ID:YTnkZ+TT
>>251のよつな相手の非を盾に自分の非を正当化する行為も議論には邪魔だな
自己勝手の押しつけが横行するようなら「JavaScript自己主張の溜まり場」がこのスレに相応しい名前だと思うぞ
2016/06/19(日) 23:09:03.89ID:J/2rkjpj
やりたきゃ自分から始めればいいし、それに誰も食いつかなければその程度だったってだけだろ。
誰も池沼を相手にしたくないし、する義務もないんだよ。
何かあるのならさっさと始めろよ。
2016/06/20(月) 12:16:18.08ID:GHIZIB85
スレタイ詐欺だな
2016/06/20(月) 23:23:32.99ID:ismdVjCJ
基本的にこのスレは>>1しかいないからこうなるわな
賛同者がいないことを盾に本題への言及を避けてるだけ
2016/06/20(月) 23:45:23.34ID:hAl2oYmp
「本題」って何?
2016/06/21(火) 11:22:12.62ID:papOtBqK
>>257
2016/06/21(火) 13:37:07.53ID:NcocGzZA
つまりかつてのECMAスレみたいに、いろんな新情報を挙げていけばいいんでしょ?
でもそれから派生した議論は別問題だよ。
匿名掲示板なんだから、自己主張の溜まり場になって当然。
逆にそうでなくすことなんて無理無理。道理に反してる。
俺は質問スレ10くらいの時から100スレ間に渡っていろんな案を出して直そうとしてきたが、
まあ様々なところで一定の収穫はあったが、議論が暴走することだけはどうしようもならなかった。
なら逆に受け取る方が考え方・気持ちを切り替えていくしかないんだよ。
2016/06/21(火) 16:31:29.25ID:wNHblGP/
新情報っていってもねぇw
2016/06/27(月) 00:33:14.94ID:n3Kagte5
TypedArrayとasm.jsの状況について詳しい人居る?

現在アプリにもっさり感がある。それであちこち修正したのだが、
ChromeDevTools/Profiles/CPU PROFILESで(program)が70-90%なのでJS側での速度改善はほぼ頭打ちだ。
そこで無理やり使用メモリを減らして速度向上させようとしている。
なお、評価はchromeで行っている。

JSのArrayは例えば [0,0,0] なら 16(header)+8*4(contents) = 48 Bytes になるようだ。
一つ中身が多いのは多分length分だろう。
元々オブジェクトだった物(26+88=116Byte)を強引にArrayに変えてこれを実現した。(項目も減らした)
ただ実際は struct { Int32, Int32, Int64 } なので本当は 16 + 4+4+8 = 32 になって欲しい。

そこで質問なのだが、
・asm.js 的記述(代入時に全部 |0 )したらメモリ確保も32bitになるかどうか
・TypedArrayの状況
を知りたい。

通常asm.jsは速度面ばかり話に出ていて、メモリ面の話が無い。
とはいえJITだと普通は無理だと思ので、
他の含めて何らかの方法でメモリ確保量を減らす方法を知っていればよろしく。
以下を見る限り、そういう用途向けではなさそうだが。
http://www.h2.dion.ne.jp/~defghi/asmjs/asmjs.htm

TypedArrayは使用メモリ自体は確実に減らせるはずだが、速度が異常に遅いのが気になっている。
以下で俺の環境だとざっくり7/7/100+/300+(以降全部)とかだ。
http://jsdo.it/sapphire_al2o3/sPa5
余計もっさりするようでは意味無い。試したことがある人は居るかい?
ググッたが、TypedArrayについては軒並み記事が古く、しかもやはり「遅い」という物が多い。
2016/06/27(月) 00:37:31.51ID:rG4NGWrk
生成が重いだけだろ
使い方を間違えてる
2016/06/27(月) 01:40:09.28ID:n3Kagte5
一応全体的に遅いということなのでそうだと勝手に思っていた。古いが以下。
http://blog.livedoor.jp/abars/archives/52103965.html

とりあえず確かめてみた結果、読み書きは1.5倍程度遅い。
許容範囲かといわれれば微妙だな、、、、
なおデータがなかなか安定しなかったので、若干怪しい。
サイズは俺が使う予定の1000にした。
このサイズなら確保との差が見えないが、オリジナルのサイズ(1.6M)だと見えていた。

function testArray(data, n, iter, start) {
var time_enter = Date.now();
for(var j=0;j<iter;j++)
for(var i = 0; i < n; i++) data[i] = i & 0xFFFFFFFF;
var now = Date.now();
return [now-time_enter, now-start];
}

function check(iter){
var start = Date.now()
console.log('array: '+testArray(new Array(count), count, iter, start));
start = Date.now();
console.log('Int32Array: '+testArray(new Int32Array(count), count, iter, start));
}

var count = 1000;
for (var i=100;i<100000000;i*=10) check(i);
2016/06/27(月) 01:40:47.25ID:n3Kagte5
array: 1,2
Int32Array: 2,2
array: 2,2
Int32Array: 4,4
array: 22,22
Int32Array: 35,35
array: 235,235
Int32Array: 369,369
array: 2544,2544
Int32Array: 3665,3665
array: 24831,24831
Int32Array: 36757,36757
2016/06/27(月) 02:01:59.30ID:n3Kagte5
しかしどうやっても Int64 を生成できないのが問題だ。
実装としてはInt64を使わずにdouble64なのかな?
だったら変換が毎回発生せずに済むからいいけど。
2016/06/27(月) 02:43:48.33ID:Krh8v6Tl
> しかしどうやっても Int64 を生成できないのが問題だ。

はぁ?
2016/06/27(月) 02:59:51.93ID:rG4NGWrk
Chromeで試したけどInt32Arrayが全て上回った
2016/06/27(月) 03:37:44.60ID:1KZKLXAx
>>268
> 他の含めて何らかの方法でメモリ確保量を減らす方法を知っていればよろしく。
オブジェクトプール使え
2016/06/27(月) 04:57:14.28ID:Hl6kI6LE
>>270
古いが、じゃない。あまりにもあまりにも古すぎる。
例えばV8は1年前はasm.js用の特別な最適化はしないと言っていたのが、
今では実装がほぼ完了している。
時代の流れというのはとてつもなく早いのだよ。
半年以内の記事でないと評価に値しない。

>>268
通常配列の最適化はエンジンによりまちまちだが、共通して言える分としては
全要素がSMI(≒Int32)かDouble時の最適化のみ。
SMIの要素にDoubleが交じるとそれはDouble配列として最適化される。

そして確かにasm.jsベースで書けば理論的には最大パフォーマンスに近いものが作れるだろう。
でもそれは例えば変数は同時にレジストリに乗る程度の数個に厳選して、
他は全て型付配列のアクセスに置き換えるテクから始まり、
メモリ上のデータの配置にまで気を使って初めて実現できること。

勿論大本のアルゴリズムは言うまでもなく最適でないといけない。
それが昨日今日asm.js始めたばかりの人間にできるかといえば否。
昔アセンブリで最適化してた経験でもないと人力では限界がある。

>>272
もし本当にInt64を効率よく扱いたいのなら時代が追いついていない。
丁度今議論中。3年後にどうぞ。
2016/06/27(月) 17:22:50.14ID:PSQIpa+S
Int64はなんでないのかねえ
2016/06/27(月) 18:12:51.74ID:8aVYS4Ar
逆に考えればすぐ答えは出るよ
何故Float64Arrayはあるんだろうと
2016/06/27(月) 23:12:26.18ID:n3Kagte5
>>275
今回は保存用(内部保持データ)なのでそれは使えない。

>>276
> 半年以内の記事でないと評価に値しない。
それはそうだが実際に遅い。
FF(47.0)でも試したが、上記ほどの差はなく、ほぼ1倍だった。
絶対値としては両方ともchrome(50.0.2630.1 canary SyzyASan)のInt32Arrayとほぼ同じで、
chromeのarrayが速いだけのようだ。
なお古いchrome(49.0.2623.112 beta-m)でも試したが傾向は同じ。(ただし全体的になぜか5倍ほど遅い)

とりあえず環境によるのかもしれないので、>>270の結果(>>271)を環境とともに貼ってくれれば助かる。
コピペすればそのまま実行できる。当たり前だが数字が大きい方が遅い。
なお>>271はchrome(50.0.2630.1 canary SyzyASan) + Vista だ。

> そして確かにasm.jsベースで書けば理論的には最大パフォーマンスに近いものが作れるだろう
いや、だからそれは「局所的」速度の話だろ。
俺は「全体的」速度を上げようとしている。
不要なオブジェクト生成はしていないので、メモリ攪拌はない。
ただし、どうしてもキャッシュミスは多いはずなので、これを改善しようとしている。
アクセスは150個単位で行われるため、TypedArrayにまとめてしまえばキャッシュヒットするようになる。(はず)
https://sites.google.com/site/shunichisnote/translations/data-oriented-design
ただ、今はそれ以前の段階で、全体的なメモリ使用量を削減しようとしている。
2016/06/28(火) 15:51:09.22ID:+n63MTqJ
あのねぇ、銀の弾なんてないのよ。
JIT用最適化ってのはね、理論が正しくても1つ書き間違えただけで台無しになったりするし、
小さなベンチの結果では大きなコードの結果が予測できないこともある。
それこそ最も確実なのはAOTで予測しやすいasm.jsに出来るだけ落としこむことなのよ。
JITの範囲で君の書いたどんな代物か分からないコードが、
どうすれば良くなるかなんて最早一般的な話ではできないのよ。

もうどんな見るに耐えなくなっても良いのでとにかく速さだけを追求したいということなら、
それはもう人が書くようなJSでなくなることは確か。
そこまで行かずとも、今よりいくらか無難に改善したいということなら、
それこそそのコードに依存するとても細かな話で難しい。

というか君もそういう密接な協力をして欲しそうな態度を取ってないし、
結局はただ自分がやってることの進歩を見て欲しいとか、
寂しくないよう日記のつもりでここに書きたいだけでしょ?
そういうのが悪いとは思わないけど、ただ返信してくれた相手を否定する病を発症しちゃあオシマイよ。
そこは君の弱さだよ。
2016/06/28(火) 20:52:20.95ID:A7Bg25Ta
そう思いたければそれでいい。
ただ、その姿勢がお前らが全く上達してない原因だと思う。
俺は間違った指摘に対して間違っていると言っただけだ。

Cの奴らがあくまで「技術的」なのとは対照的に、お前らは「精神的」な物言いばかりだ。
ある意味、やっていることが「Web的」だ。言ったもの勝ちみたいな馬鹿が多い。
とはいえ、間違っていることをいくら主張しても正しくはならない。

そもそもオブジェクトプールはインミュータブルの世界ではほぼ意味がない。
http://www.html5rocks.com/ja/tutorials/speed/static-mem-pools/

そして俺はJIT向けの最適化をしようとはしていない。
事実、メモリをケチるとか、一度にアクセスするデータを纏めるとか、どの言語でも高速化する。
実際、>>279内URLも言語には言及されてない。

もちろんそれ以前に他の改修点も多い。今はそこを整理中だ。
とはいえ、その先の「将来的改修方法」まで見据える必要があるので確認中ということになる。

>>280
ところで、何でお前はそんなに認めて君なんだ?
俺の質問は「asm.jsでフットプリント削減/メモリ配置決めうちは出来るか」であって、
「asm.jsで局所的高速化が出来るか」ではない。
つまり、脱線しているだけだから素っ気ない回答になっているだけだ。
俺がやろうとしているのは、君が思っているasm.jsの使い方ではない。
2016/06/29(水) 20:10:31.16ID:oxwc/50g
自分の話なのに他人を非難し始めた!?
こりゃ重病や〜
2016/06/29(水) 20:14:07.66ID:oxwc/50g
こいつの親はなんで
「相手がどう思うかが大事」
「自分が伝えたつもりでも相手に伝わってなかったら意味が無い」
って教えてやらなかったのかな……
むごいね。
2016/06/30(木) 01:34:38.72ID:YtNZP2Mq
ちなみに、当面の問題は解決した。
実はもっさりというよりはカクカクに近かったのだが、原因はキャッシュによるHDDアクセスの過剰だった。
ヘッダに cache-control: no-store を追加したところ、完全に治った。
ただそれでも(program)が70-90%であることには変わりないのだが、
スクレイピング中でも(idle)は80%以上なので、キビキビ感はある。

前にも書いたが、(>>109)
CPUだけで動く部分は実は相当速くて、UIが主なJavaScriptではCPUを使い切ることはないのかもしれない。
俺の場合はスクレイピングが律速過程なので、サーバの速度が上がらない限りここで頭打ちだ。
数値計算のように完全にCPUだけで回るのなら限界が見えるが、そういう用途はないし。
遅延描画は制御がやや面倒だが、実現してしまえばDOMは1画面分しか扱う必要がなく、一瞬で処理される。

俺のアプリに関して言えば、階層スクレイピングを行っているので、
下位階層を参照する時は更新されていることが確定している。
だから no-store で全く問題ないし、あと5倍の余裕があるので、残るは美学的問題だけになった。
ここを修正するかはしばらく様子見になる。
情報をくれた人はありがとう。
2016/06/30(木) 06:40:45.54ID:K37QNM6P
こういう自分用語多用・技術文書風自分語り・後出し情報でドヤ顔・他言語へのコンプレックスを持つ>>284
スルーできないことこそ、お前らwが上達できない理由wだと思うよ
2016/06/30(木) 14:59:19.41ID:YdAxXmxA
普段スルーするようなキチガイでも無人島じゃコミュニケーション取るしかないのと同じ。
2016/07/17(日) 18:00:55.04ID:UzC9Qtsn
http://echo.2ch.net/test/read.cgi/tech/1468158373/213
質問スレ>>213
自己紹介乙。
てかお前はどうしてそこにこだわるのか全く謎なのだが。

普通に考えれば、引き算が出来るのならMDNで、
> var elapsed = end.getTime() - start.getTime(); // 時間をミリ秒で表す
> https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date
これは明らかにおかしくて、
var elapsed = end - start; // 時間をミリ秒で表す
となるべきだろ。お前が言う「経験のある」奴ならここに地雷臭をかぎ取るわけ。
何らかの理由で getTime() しないといけないんだよ。
とはいえ、今1stEdition(1997)見ても abstruct operator という単語自体は使ってないが、
他は同じなので、最初から出来たのではないかとも思うのだが、、、まあよく分からん。
http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%201st%20edition,%20June%201997.pdf

実際、彼がググって来た例でも直接引き算してないだろ。
俺が(当時)ググッた限りでも出てこなかったから、何かしら理由があるのだと思う。
というわけで俺は「使えない」判定を下していた。

で、これは多分「既に他言語を知っている奴」の普通のやり方なんだよ。
俺がお前に「経験がない」と断定しているのはこういうのが全く通じてないから。

何度も言っているが、お前はもっと書いた方がいい。
ここに質問に来る奴の大半は、「MDNを読め」で済む。
ただお前はもう教科書的な知識は十分にあるんだよ。
だから仕様書をいくら読んでもそれ以上にはならない。
お前が上達するには、書くしかないんだよ。
2016/07/17(日) 18:23:29.08ID:UzC9Qtsn
一応俺の疑問としては、
ToPrimitive(Number) は 無変換で Number そのものを返す。(9.1)
ToNumber(Number) は 無変換で Number そのものを返す。(9.3)
GetValue(V)はVが参照でなければ V そのものを返す。(8.7.1)
+ は ToPrimitive(GetValue(target))の型がStringならString連結、
そうでないなら ToNumber(ToPrimitive(GetValue(target))) で数値の和を返す。(11.6.1)
Date型は内部に time values を持ち、abstruct operationはこれを対象とする。(15.9.1)

だったら足し算も出来ないと駄目じゃね?ってことね。
厳密に言えばGetValueはabstruct operation ではないので、
仕様と実装に矛盾が無い為には、 GetValue(time values) がStringを返す必要がある。
こうなんだっけ?
2016/07/17(日) 18:30:48.46ID:PyzTEoPA
まだ43cmの深淵にはたどり着けないようだなw
2016/07/17(日) 18:40:03.90ID:UzC9Qtsn
>>289
いやそれ何の事よ?
誤爆かと思いきや、そうではないのなら、
とりあえずブラウザバグっているからリロードしとけ。
2016/07/17(日) 18:50:05.41ID:UzC9Qtsn
ああ、引き算を確認するの忘れてた。

- は ToNumber(GetValue(target)) を引いて差を返す (11.6.2)
ToNumber(String) は 9.3.1 に従いパースする (9.3)

9.3.1内にはDate.toString()出力をパースする仕様はない。
だからGetValue(time values)はNumberを返さないと引き算は出来ない。
となると足し算も出来ないと仕様外のように思える。

なお確認している仕様はECMA5.1
http://www.ecma-international.org/ecma-262/5.1/#sec-11.6.1
2016/07/17(日) 18:54:57.34ID:PyzTEoPA
>>290
> いやそれ何の事よ?
布石だよw

俺は最初から正しいことを
言っていたと示すためのな。
2016/07/17(日) 18:55:32.09ID:PyzTEoPA
>>291
だから仕様通り(笑)
2016/07/17(日) 19:13:09.85ID:UzC9Qtsn
>>292
まあ何か思惑があるのならそれでいい。
ただ俺が見る限り今のところはAddが出来てもおかしくない仕様のように見える。
もちろん俺は仕様書なんてほぼ見てないから、先のように単語を変更されていると気づけないが。

まあいいや、とりあえず新着情報があるまではどうにもならんし。
現実的にDateが揃いも揃って仕様違反って事もないだろうし、
先の例のように俺が仕様書を読み慣れていないせいで見落としている部分があるのだろう。
2016/07/17(日) 19:23:49.21ID:UzC9Qtsn
> (今回で言えば日付型同士の減算が可能!?) (質問スレ>>213)
あと一応言っておくと、日付型ってのは普通は減算出来るんだよ。
だから質問者もいきなり減算しているし、
俺も逆にそれが出来ない!ってことでMDNに奇妙さを感じるわけでね。

だからこの点についても、この反応、もう一度書くと、

> (今回で言えば日付型同士の減算が可能!?) (質問スレ>>213)

これは経験豊富ならあり得ないんだよ。
で、そういうのは明らかにバレバレだから、
普通に考えてお前が経験豊富だと思う奴はいないと思うんだよね。
何でそこにこだわるのか全く分からないんだけど。
匿名掲示板で虚勢を張る意味無くね? 👀
Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f)
2016/07/17(日) 21:11:43.34ID:PyzTEoPA
>>295
何いってんのお前w

MDNに日付の減算が出来ないなんて書いてないし
それなりにJavaScript使ってりゃ、
日付同士の引き算とかやるだろ。
ベンチマークとかでさ。

当たり前の知っていることなんだが?
お前にとっては当たり前じゃないんだろ?w
2016/07/17(日) 21:12:34.25ID:PyzTEoPA
> 現実的にDateが揃いも揃って仕様違反って事もないだろうし、
だから最初から仕様通りって言ってる
2016/07/17(日) 22:11:41.91ID:UzC9Qtsn
つか相変わらずお前は都合が悪いところは読まない主義なのなw

MSDNでもやっぱりgetTime()してるんだよ。
https://msdn.microsoft.com/ja-jp/library/ee532932(v=vs.94).aspx

既に言ったがMDNも。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date

ついでにStackOverflowでも軒並み。
http://stackoverflow.com/questions/10931288/how-to-add-subtract-dates-with-javascript
http://stackoverflow.com/questions/1296358/subtract-days-from-a-date-in-javascript
http://stackoverflow.com/questions/7687884/add-10-seconds-to-a-javascript-date-object-timeobject

基本的にDateオブジェクトの直接操作は誰もやってないから、何か理由はあるとは思うんだけどね。
それが何かは俺には分からない。
考えられるのは、オブジェクト指向的な「メソッド越しに全てやれ」なのか、
実装ありきで来ている為、実は「仕様的裏付けがない」のか。(将来的に使える保証がない)
いずれにしても、サンプルコードにそう記述しない理由があるのは確かなんだよ。

どっちにしたってここまで地雷臭だと公開するコードなら直接操作は止めたほうがいいとは思うが。
質問者は今動けばいい個人レベルのコードだろうから別に構わないとは思うけど。
2016/07/17(日) 23:04:02.72ID:PyzTEoPA
だからgetTime使ってるからって
そのまま使えないってことにはならないんだが。
馬鹿なのかな?
2016/07/17(日) 23:28:43.23ID:UzC9Qtsn
まあどう思うかは自由だが、状況証拠からの推測なら、

1. 引き算は出来ているだけで、仕様として認められているわけではない
2. 多分俺の既投稿の解釈も間違いがあり、addの方は「仕様」で、subの方は「仕様外」

じゃないかな。以下でもgetTime()で引き算だ。
> delta *= date2.getTime() - date1.getTime();
> https://github.com/phiggins42/bloody-jquery-plugins/blob/master/date.js

とにかく確実に言えるのは、みんな引き算する前に getTime() してるんだよ。
オブジェクト同士を直で引き算している人は誰もいない。

で、もし君が「経験豊富」なら、
実はこういう「動くけど仕様外」のケースも結構あることを知っているはずなのだが。
だからマジでウザイしバレバレだから、いい加減にやめい。
いずれにしても、本当に経験豊富な奴は、誰も君のことを経験豊富だとは思わないよ。
虚勢を張るのも自由ではあるけど、意味無いと思うが。
2016/07/17(日) 23:30:23.23ID:PyzTEoPA
× 1. 引き算は出来ているだけで、仕様として認められているわけではない
○ 1. 引き算は出来ているし、仕様として認められている
2016/07/17(日) 23:31:41.37ID:PyzTEoPA
× 2. 多分俺の既投稿の解釈も間違いがあり、addの方は「仕様」で、subの方は「仕様外」
○ 2. addの方は「仕様」で、subの方も「仕様」

http://www.ecma-international.org/ecma-262/5.1/#sec-11.6.1
ここにもしっかり書いてある。
2016/07/17(日) 23:33:08.55ID:PyzTEoPA
しっかり書いてあるのに、それがわからないってことは
英語が読めないか、読めても意味がわからないんだろうな。

自覚して諦めて日本語でぐぐったら?w
2016/07/18(月) 00:12:28.04ID:CK8ZYmxh
>>302
Note1だろ?
> Date objects handle the absence of a hint as if the hint String were given.

辿ってみたが、なるほど[[DefaultValue]](8.12.8)の所でデフォがDateに関してはStringというのは分かった。
そしてValueOf()が返してくるのはこれだから、Add側がString連結になっているのはこれでいい。
ただこれだとsub側が都合が悪い。つまり、もう一度書くと、以下になっているわけだが、

> - は ToNumber(GetValue(target)) を引いて差を返す (11.6.2) (>>291)

GetValue(target)がデフォでStringを返してくるのでデフォのままでは引き算は出来ない。
一応GetValueにはPreferredTypeを指定することが出来て、
Numberを指定していれば数値が返ってくる。
だから仕様としてsubを定義する為には、subの時はNumber指定しないといけない。
で、それはどこに書いてあるんだ?

なおお前が大好きなmoment.jsも確認したが、同様に直ではなく、こちらはvalueOfを使っていた。
> mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);
> http://momentjs.com/downloads/moment.js
つってもMDNには同じだと明記されているが。
> This method is functionally equivalent to the Date.prototype.getTime() method.
> https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/valueOf

いずれにしても、何かしら理由があったんだと思うが。
とりあえず5.1で確認出来たらその記載が旧仕様にあるかどうかを確認すればいい。

つかこの際英語は関係ないだろ。そういうのもコンプレックス出まくりだから止めたほうがいい。
英語は日本語より下手なのを自覚した上で、ヒット件数と内容をとるか、言語をとるかでしょ。
2016/07/18(月) 00:17:12.76ID:CK8ZYmxh
しかし話はそれるが、この仕様だと + と - なら - の方がToPrimitive()がない分処理が軽いな。
ベンチマークに現れるかは謎だが。
2016/07/18(月) 00:30:21.22ID:UhcVRSnP
>>304
> だから仕様としてsubを定義する為には、subの時はNumber指定しないといけない。
> で、それはどこに書いてあるんだ?

お前は本当に馬鹿だなぁw

リンクは http://www.ecma-international.org/ecma-262/5.1/#sec-11.6.1 だろ
sec-11.6.1 だろ。
The Addition operator ( + ) だろ。

次の sec-11.6.2 になんて書いてあるのかも読めないのか?
2016/07/18(月) 00:31:42.75ID:UhcVRSnP
>>304
> つかこの際英語は関係ないだろ。そういうのもコンプレックス出まくりだから止めたほうがいい。

お前が英語読めないんだろ?
だから自分で持ってきたリンクも読んでないんだろ。

それともなにか?自分が持ってきたものを
読めるのに、読んでないのか?
2016/07/18(月) 01:13:38.23ID:CK8ZYmxh
ああ、なるほど分かった。
String変換はToPrimitiveの時であって、GetValue時ではないんだな。
この点を>>304では間違えていた。

Add: ToPrimitive(GetValue(target))でStringになって、それを連結。
Sub: ToNumber(GetValue(target))でNumberになって、引き算。
SubではToPrimitiveがないのがミソだ。

となるとそちらの主張通り、
> ○ 2. addの方は「仕様」で、subの方も「仕様」 (>>302)
のように見える。

さて、記載されている箇所は分かったので初期仕様(1997)版を確認したが、
http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%201st%20edition,%20June%201997.pdf
11.6.1 The addition operator(+)
11.6.2 The subtraction operator(-)
9.1 ToPrimitive
9.3 ToNumber
15.9 Date Object
に本質的な違いがあるようには見えない。
つまり、最初から仕様としてaddもsubも使えた(今と同じ動作だった)ように見える。
しかし誰もsubを使っていない。となると結論としては、

仕様には最初から盛り込まれていたが、
A. 実装が追いつかず、動かない環境が多かった。(あった)
B. バグっていて使える状況ではなかった。

のどちらかだね。
今後については、自分が対象とするブラウザで動作を確認出来れば使えばいいということになる。
はい、お疲れさまでした。
2016/07/18(月) 01:26:28.55ID:UhcVRSnP
> しかし誰もsubを使っていない。となると結論としては、
お前が見た限りの話だろw
使ってないだけで、使えない理由にはならない。

C. たまたま検索した所が使ってないところだけだった

昔うんぬんかんぬんが事実だとしても
今使えない理由にはならないからな。

事実として、今問題なく使えると判明しているものを使ってないだけ。
故に使ってないからと言って問題があるという事にはならない。
2016/07/18(月) 01:28:24.23ID:UhcVRSnP
で最終的な結論は俺が最初から言っていたとおり、
addも仕様、subも仕様。

こんなこと理解するまでに何時間費やしてるの?
センス無いんじゃね?w
2016/07/18(月) 01:44:14.47ID:CK8ZYmxh
>>309
まあどう思おうが勝手だが、
基本的にはライブラリ開発者もMDN執筆者も俺よりJavaScriptの経験は明らかに豊富で、
その彼等が回避している事を俺がわざわざ試す意味はないよ。
君のアプリは君が好きなようにすればいい。

俺がセンス無いと思うのならそれでいい。
ただ、そんな無駄吠えしている限り、君は上達しないよ。
2016/07/18(月) 01:55:05.46ID:UhcVRSnP
使ってない=回避と考えてるのが
お笑い種だw

自分で持ってきた仕様書に俺が何度も
書いてあるって言ってようやく読んだくせにな。
理解遅すぎるんだよw
2016/07/18(月) 01:57:21.33ID:UhcVRSnP
きっとこの程度の理解能力じゃ
なんで+がこういう仕様になっているかも
まだ気づいてないんだろうな。
俺が指摘してようやく考え出すぐらいだろうw
2016/07/18(月) 02:02:36.39ID:CK8ZYmxh
>>313
+は文字列内埋め込みにはこの方がいいからだろ。あれはあの仕様でも良いんだよ。
ただいちいち toString() する仕様でも良いんだよ。

てかお前は異様に「仕様」談義が好きみたいだが、マジで何か書いた方がいいぞ。
そしてその中で素晴らしいライブラリの使い方を披露すれば、布教も出来るだろ。

ついでに言っておくと、今回の質問者の「ライブラリは…」ってのはかなり妥当な状況だよ。
いちいちあの程度でライブラリを導入する方が手間なんだよ。
2016/07/18(月) 02:06:50.86ID:CK8ZYmxh
あーそういえば43cmってなに?
厨二病だとは思うが聞いておいてやるよw
2016/07/18(月) 02:07:17.57ID:UhcVRSnP
はっはっは、仕様を持ち出してきたのはお前だし、
俺は、そこに書いてあるから読めといっただけだ。
俺は談義なんてなんもしてねーぞw
2016/07/18(月) 02:08:12.29ID:UhcVRSnP
>>315
ぐぐれかすw
俺が最初からこの程度のことを知っていたことを
証明するためのサイトだ。
2016/07/18(月) 02:16:59.61ID:CK8ZYmxh
あーまあ確かに今回は結局の所ほぼ自力で辿り着いているから、
確かに談義もしてないし、協力も大してしてもらってないわな。
とはいえ、getTime()については俺は前から疑問を持っていたからついでに調べたんだ。

>>317
これか?
http://d.hatena.ne.jp/sandai/20100916/p1
んー、まあこれを読んでも今回の結論には至らないけどな。
ちなみに俺は仕様書を断片的にしか読んでないから、多分
ToPrimitive(Number)がvalueOfを呼び、
ToPrimitive(String)がtoStringを呼ぶのは予想出来るが、
それがどこに書いてあるかまでは確認してない。まあもういいが。
2016/07/18(月) 02:31:49.78ID:UhcVRSnP
>>318
そこも少しあるが、そこのリンク先だw

おめでとう、ようやく俺に追いついたなw
2016/07/18(月) 02:33:00.01ID:CK8ZYmxh
>>313
ああちなみに一応コメントしておくとな、

11.6.1のNOTE1で例外規定を書いているだろ?これは結局の所 if 文が必要になるんだよ。
だから仕様としては、「文字列として連結したいなら常に toString() 」の方が綺麗になる。
そうすれば+だけあるToPrimitiveが除去可能で、+と-を同じ関数で処理する目が出てくるだろ。
現実にはこれだけでは駄目だけど、そうやって無駄な関数を増やさないのが良い設計なんだよ。

本来腕前ってのはこういう「如何に無駄をなくすか」で勝負すべきであって、
お前らがやっているみたいな
「1行のチューニング」「俺の方が仕様に詳しい」「俺の方が短い」ではないんだよ。
2016/07/18(月) 02:38:48.12ID:UhcVRSnP
無駄をなくすなっていうのは、
一行の無駄もなくすって意味だし、
(コンピュータにやらせる)

仕様を出してきたのはお前だし、

短いっていうのが無駄をなくすってことだし。

わかってねぇなぁ。
今時アセンブラで書くとか言う話をするのかねぇ。

一番の無駄は人間が作業することなんだがw
2016/07/18(月) 02:42:22.09ID:CK8ZYmxh
>>319
これか。確かに俺が確認したのと同じ事だな。
http://os0x.hatenablog.com/entry/20100916/1284650917
2016/07/18(月) 02:45:40.64ID:UhcVRSnP
>>322
読めば一瞬で終わってた内容。
おつかれさんwww
2016/07/18(月) 02:47:05.64ID:CK8ZYmxh
>>321
まあ今のお前にいくら言っても分からないとは思うが、必要なのは、
「構造的」簡潔さなんだよ。
「記述的」簡潔さではない。
もちろん記述も簡潔な方がいいんだけどね。
とはいえ、構造が簡潔なら記述が複雑になることもないんだよ。

とにかくお前は大きいのをまずは書いてみることだよ。
そうすれば色々と至らなさが分かると思うよ。
2016/07/18(月) 02:49:44.99ID:CK8ZYmxh
>>323
それはない。
俺の疑問はgetTime()が何故いるのか?であって、
add/subについてではないから。

まあこの際どうでもいいが。
2016/07/18(月) 03:01:24.39ID:vbFE3yAk
また殺人くん呼ばわりのあのアホかな。

あのな、DateTimeというのは、日付と時間だよな。ある一点を指し示す値だ。もっと詳しく言えば、ある内部値を、日付と時間として扱えるようにしたオブジェクトだ。

その、「ある一点を指し示す日付と時間同士を、四則演算する」って凄くナンセンスだと思わない?

ある一点と、ある一点の間の距離は、numberか?
違うよな。
.net見てみろよ。TimeSpan型がある。

例外とかそういう馬鹿な話じゃない。

頭の中を整理して、できて良いかできてはいけないのか精査せえ。

何故getTimeしてるかわからんのか?
エポックとして、一点の情報ではなくなり、原点からの長さとして値を返してると考えるとことができる秒に変換しとるよな。要はベクトルに。

お前高校数学からやり直してこいよ。
2016/07/18(月) 03:02:19.26ID:vbFE3yAk
>>326
言い忘れ。
「ベクトルなら加減乗除自在だよね」とダメ押ししとくわ。
2016/07/18(月) 03:11:07.49ID:UhcVRSnP
>>325
> 俺の疑問はgetTime()が何故いるのか?であって、

日付に +1 するときだろw
2016/07/18(月) 03:13:48.33ID:UhcVRSnP
いま普及している言語で、完璧な
構造的簡潔さとやらを備えてる言語ってなんだろうねw

重要なのは道具として使えることだよ。
道具として使えるならば簡潔でなくても良かった。

そうやって、制限のある中で今まで
実現してきたんだって。
2016/07/18(月) 05:04:13.15ID:FfTrxk2L
>>325
ES.nextでvalue-objectやらvalue-proxy、もしくは演算子オーバーロードが議論されてるよ。
まあとは言え今のDateをそのまま対応させるのはナンセンスだし、いろいろ問題あるから、
サフィックスで数値型を拡張できる優秀な案を使って、
1s -> <time>(1s)
2016Y+7M+18D -> <time>(1468767600000s)
3s - 1s -> <time>(2s)
date - 1s -> <date>
の用にできる。

まあその場合もgetTimeが要らなくなるわけじゃない、
勿論今でも単項+演算子使えば要らないので、要らないの定義によるが、
君は結局もっといい形があるじゃん、と言いたいのか、なんなのかよくわからないな。
2016/07/18(月) 23:56:44.27ID:CK8ZYmxh
>>330
基本的には
・getTime要らないなら何故いちいち付いているのか?(全員付けているのか)
・今確かに動いているが本当に引き算は出来るのか?(仕様内なのか)
の確認だから。

今の仕様でもそんなに悪くないけど、直交してないから実装に負担がかかる。
とはいえ今更変更することは無理だし、
新仕様を検討している連中はこの辺全て分かっているだろうから、見守るしかないね。
なおgetTimeが要らないといっているのは引き算時限定であって、(これは経緯を見れば分かるはずだが)
やっぱりlodash君は「前との関連で」の会話が出来ないんだな。
多分ガチのアスペなんだと思う。

とはいえここは匿名掲示板なんだから、俺たちがアスペに対して気を使う必要はない。
(個人を特定して気を使う必要はない)
過去の発言は全部読めるのだから、ちゃんと読み直して付いてこいとしか言えんね。
lodash君の会話の組み立て方では普通は荒らし扱いされる。
それは読み直すことによって多少は改善するから、まずはそれを心がけることだ。

という書き方だと伝わらないのかな?
まあしかしこれ以上面倒見れんが。
2016/07/19(火) 00:27:47.65ID:gHzhdyCj
> ・getTime要らないなら何故いちいち付いているのか?(全員付けているのか)
たまたま

> ・今確かに動いているが本当に引き算は出来るのか?(仕様内なのか)
仕様に書いているのだから、仕様通り
2016/07/19(火) 00:39:36.64ID:gHzhdyCj
> なおgetTimeが要らないといっているのは引き算時限定であって、(これは経緯を見れば分かるはずだが)

他にどんな演算子があるかぐらい調べろよw

new Date() / 1
new Date() * 1
new Date() % 10
new Date() ** 1
+new Date()
-new Date()
~new Date()
new Date() > 0 (< <= >= も同様)
new Date() << 1 (>> >>> も同様)
new Date() & 1
new Date() | 1
new Date() ^ 1

これらも仕様通りgetTime()はいらない。

というか逆に+のときだけgetTime()が必要と思ったほうが良いぐらい。
+は文字列結合と数値の加算の二つの意味があるから、仕方なくこうなってしまったという話。
(それ以外は二つの意味はない)
2016/07/19(火) 00:48:15.24ID:gHzhdyCj
> 今の仕様でもそんなに悪くないけど、直交してないから実装に負担がかかる。
> とはいえ今更変更することは無理だし、

直すならばDateの仕様ではなく、+オペレーターの方。
Perlみたく、+ は数値演算、 . で文字列結合 とするしかない。
2016/07/19(火) 01:05:34.97ID:gHzhdyCj
どうやら俺の発言が気に食わないようだが
俺に比べて技術と知識も劣ってるから、
getTimeがいらないのは引き算限定とかいう
発言で反論しようとするんだよなw

一般論として技術力が高い人ほど多くのことを
知っているんだよ。知ってるからこそ技術力も高くなる。
関数型プログラミングはいいよ。コードがシンプルになる。
lodashやjQueryは便利なライブラリ。
2016/07/19(火) 02:25:00.57ID:9Xihfq37
相変わらずアスペ全開だな。

まあついでに言っておくと、JavaScriptの連中は仕様書を書いている連中すらゴミだってことだ。
オブジェクト指向を理解出来てない。

Type固有の案件は全部15章に突っ込まないと駄目だ。
11章の演算子(+)に書くとか、親クラスのメソッドに子クラス毎にif文入れているようなものだ。
あの仕様書では頭からお尻まで全部読まないと理解できない。典型的な駄目コードだ。
だから俺も読み込むまでに余分に時間がかかった。

var Object = {
operator+: funciton() {
if (typeof(this)==='Date') // 11.6.1 NOTE1 // 現行仕様書
}};

var Date = {
operator+: function() { // 15.9.X // こっちに書くべき
}};

Type固有の例外規定が15章に書いてない時点で仕様書の構造がゴミ。
但し書きはダブって良いので、15章にも書き、そっちがオリジナルであるべき。
上記上側みたいに、Dateオブジェクトの特別扱いを、子クラスでメソッドをオーバライドせず、
親クラスのメソッドにいちいちif文入れてこられたらキレるだろ?
上記下側のように、子クラスでオーバライドした上で、
親クラスのメソッドに「Date型ではオーバライドされています」とコメントを付けておくべき。
2016/07/19(火) 02:25:35.18ID:9Xihfq37
お前らの大半はこれにすら気づけないと見ている。
正直、JavaScriptの連中が上達してないのはかなり根が深い問題だと認識し始めてる。
仕様書すらこれだ。
多分君らの大半は何が良いコードなのかも理解出来ていない。
それはまともな構成の仕様書/コードを見たことがないからだ。
これについては、丁度OOPのスレでそれを問う勇者がいたから見てくるといい。(今は死にスレだが)
http://echo.2ch.net/test/read.cgi/tech/1467992113/10
http://echo.2ch.net/test/read.cgi/tech/1467992113/65

例えば仕様書だけでもまともであれば、
無意識的にオブジェクト指向を学習出来たはずなのだが、そうなっていない。
この酷い仕様書を読むまでは気づかなかったが、
当たり前だが他言語の仕様書は達人が書いているので、こうはなっていない。
だから仕様書を読んでいれば無意識的に
オブジェクト指向(正確には著者のプログラミングスタイル)も学習していける。
JavaScriptにはこれがない。つまるところ、教科書が悪いから上達しにくい。
それでも、他人のコードをほぼ全て見える状況は、おつりが来るほど有利だとも思うのだが。
2016/07/19(火) 03:43:57.22ID:pXKjqsL9
上達くんはトリップ付けてくれよ
2016/07/19(火) 04:38:03.16ID:gHzhdyCj
自分の能力不足を仕様のせいにまでしてきたねw
2016/07/19(火) 04:50:08.67ID:gHzhdyCj
Dateにオペレータ+を書くとかさ間抜けすぎるっていうかw
世の中にはいろんな言語があるってことを知らないんじゃないかねぇ。
そして最高の言語があるとか思ってるんじゃないかねぇ。

JavaScriptにおいて演算子はクラスのメソッド(相当)ではない。
演算子のオーバーロードがないのもクラスのメソッドじゃないからだ。
だから演算子が特定のクラスにつくことはない。

もし+演算子がクラスのメソッドであれば、それはクラスごとに変更可能であるはずだ。
また戻り値も好きに変えられるはずだ。(例えばComplex型+Complex型の結果をComplex型にする等)

だけどJavaScriptではそれは出来ない。といったらJavaScriptは劣ってるとか言うんだろうな(苦笑)
これは言語のコンセプトの違いでしか無い。スクリプト言語としてそういう設計になってる。

JavaScriptにおいて演算の結果は文字列か数値にしかならない。(厳密に言えばNaNとかもあるが)
演算子はクラスメソッドではなく、演算子が使われた段階でオブジェクトはプリミティブ型に変換される。
Date型に対して+メソッドが呼ばれるのではなく、プリミティブ型への変換メソッド(valueOf)が呼ばれる。
その後に演算子の効果が働く。

な? 能力が低いんだよこいつは。
自分の知ってる○○の言語の常識でしか考えることが出来ない。
2016/07/19(火) 04:57:24.04ID:gHzhdyCj
Dateにoperator+を書くべきじゃないと言ったが、
もちろんObjectにも書くべきじゃない。

>>336はさも、Objectにoperator+があるのが
現行の仕様だと言っているが、現行の仕様は
Objectにoperator+なんてものは存在しない。
ObjectにあるのはvalueOfメソッドだ。

そしてObjectのvalueOfメソッドに if Dateなら?みたいなコードはない。
Operator+解釈のアルゴリズムの結果、Date型のvalueOfメソッドが呼ばれるだけだ。
Operator+の処理が実行されるのは、Object(やDate)のメソッドが呼び出される前だ。
それは仕様を読めばわかること。

だからこそ15章 Native ECMAScript objects ではなく、
11章 Expressions に分離して書かれているのだ。
2016/07/19(火) 09:44:05.11ID:Lmd4i1Ew
>>336
仕様書が変に構造化されてて読みにくいのは非常にその通り。
でもES2015以降徐々に改善されて行ってるよ。
そういう意味でも最新の仕様書を読んだほうが良い。

で、確かに@@toPrimitiveはビルトインではDateとSymbolくらいにしかついていないので特有だが、
別にこれは外したり自由に付けたりもできるし、処理の流れの中で例外というわけでもない。
2016/07/19(火) 17:59:10.43ID:Ll9Tyf8R
頭おかしいのかな。
オブジェクト指向でも、クラス指向ではない。
型は無いに等しい。アヒルの様に鳴き、アヒルの様に歩けば、それはアヒルである、という「見做し」を代わりに使用する。
この2つだけで、何故演算子がその時と場合で意味が変わるか、理解出来るんじゃなかろうか。

知能低すぎなのは、その程度で関数型とか言っちゃってる脳味噌じゃねえの?
valueOfは、見做しの典型だろ。
どんなオブジェクトであれ、どんな経緯でプロトタイプがチェーンされていても、それを辿って一番最初に見つかったvalueOfが使われるんだから。
レスを投稿する

5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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