[過去ログ] JavaScript の質問用スレッド vol.125 (1002レス)
1-

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
25: デフォルトの名無しさん (ワッチョイ cb01-7Kul [60.87.221.16]) [sage] 2022/08/19(金) 23:29:36.47 ID:icsyH/kW0(1) AAS
>>23
23(1): デフォルトの名無しさん (ワッチョイ 6b10-vj0F [180.12.82.129]) [] 2022/08/19(金) 18:53:07.56 ID:KbHvsoqL0(2/2) AAS
>>22
どうもです
タイマー以外のfunctionでもfunctionの途中でイベントハンドラが呼び出されることはないってことですか?
非同期処理が混在していなければ、ない
26
(1): デフォルトの名無しさん (ワッチョイ 75b1-GYjw [118.105.228.94]) [sage] 2022/08/20(土) 10:52:07.09 ID:y/gx0kbE0(1/2) AAS
Wan、Lanどちらからもアクセス可能なWebサーバーで
アクセス元がどっちなのかを判断する方法はありますか?
27: デフォルトの名無しさん (ワッチョイ 2301-cac/ [219.204.123.70]) [sage] 2022/08/20(土) 11:45:31.91 ID:ThG9yriU0(1) AAS
>>26
送信元アドレス見ればよくね?
28: デフォルトの名無しさん (ワッチョイ 75e5-s78Y [118.4.80.52]) [] 2022/08/20(土) 12:02:01.28 ID:tDO3e6hW0(1) AAS
サーバーで判断すべきだろう
クライアントで知りたいならサーバーに聞けばいい
29: デフォルトの名無しさん (ワッチョイ 75b1-GYjw [118.105.228.94]) [sage] 2022/08/20(土) 12:48:23.28 ID:y/gx0kbE0(2/2) AAS
確かにそうですよね
サーバー側で何とかしてみます
30
(3): デフォルトの名無しさん (スップ Sd43-PAk+ [49.97.96.68]) [] 2022/08/21(日) 00:53:25.42 ID:aTZvlMved(1) AAS
ナンセンスな質問かもしれませんが、JavaScriptにおいて関数はデータ型としてオブジェクトであり、一方でオブジェクトはプロパティとメソッドの集まりであると説明されています。
関数とオブジェクトはどちらが先に定義されているのでしょうか?
31
(1): デフォルトの名無しさん (ワッチョイ d501-Nnom [60.87.221.16]) [sage] 2022/08/21(日) 07:04:02.83 ID:D11cwWL50(1/2) AAS
>>30
「先に定義」とは、どのような意味?
32
(1): デフォルトの名無しさん (スップ Sd03-PAk+ [1.66.101.132]) [] 2022/08/21(日) 10:31:51.96 ID:3ESrn3ezd(1) AAS
>>31
先に存在しているとか先に実装されている(?)というようなイメージです
33
(1): デフォルトの名無しさん (ワッチョイ a37c-QAb4 [221.241.223.58]) [sage] 2022/08/21(日) 10:42:02.01 ID:KqCcLvyW0(1) AAS
>>30
定義が無限循環してると言いたいんだろうけど広辞苑にだってそういうのはあるし、関数ノットイコールメソッドと考えれば矛盾はしてない
たぶんオブジェクトが先だろうけどね
34
(1): デフォルトの名無しさん (スップ Sd43-PAk+ [49.97.98.169]) [] 2022/08/21(日) 11:25:21.77 ID:df/SIE01d(1) AAS
>>33
ありがとうございます

もう少し調べてみると、 外部リンク[html]:tc39.es でTerms and Definitionsのところに、関数はオブジェクトであってプロパティの他に実行可能なコードと状態を持つもの、という感じのことが書かれてて、メソッドはオブジェクトのプロパティの値である関数のことと書かれていました
こちらの説明で一旦納得できました
35: デフォルトの名無しさん (アウアウウー Sad9-dbST [106.181.223.3]) [] 2022/08/21(日) 11:46:37.18 ID:j3ukytx2a(1) AAS
v8のソースでも読んでみれば
36: デフォルトの名無しさん (ブーイモ MM8b-mKyu [133.159.148.135]) [sage] 2022/08/21(日) 12:32:17.30 ID:IBDK1msSM(1) AAS
オブジェクトが先
オブジェクトはプロパティのコレクション

プロパティとはkey/valueのペアのこと
keyはStringでvalueはプリミティブかオブジェクト
37: デフォルトの名無しさん (ブーイモ MM8b-mKyu [133.159.149.74]) [sage] 2022/08/21(日) 12:39:55.73 ID:ZOLz03eMM(1) AAS
オブジェクトを定義するのにオブジェクトを使ったりStringという別のオブジェクト使えるの?
と疑問に思うのかもしれないけど
定義が存在する(名前解決可能である)ことを確認するフェーズと
定義の中身を検証するフェーズを分けることで可能

foo関数の中でbar関数を呼び出しつつ
bar関数の中でfoo関数を呼び出すような関数定義ができるのと同じこと
38
(2): デフォルトの名無しさん (ワッチョイ d501-dbST [60.87.221.16]) [sage] 2022/08/21(日) 15:06:45.69 ID:D11cwWL50(2/2) AAS
>>32
「実装」というが、「仕様」上で両方とも存在しているなら、同時に「実装」されるのでは?

>>34
ES3には「オブジェクト」の定義はあるが、「関数」の定義はない
故に「歴史的にはオブジェクトが先に定義された」といえなくもないが、そんな回答を望んでいるようにも見えない
外部リンク[html]:www2u.biglobe.ne.jp

参考になるかわからないが、typeof演算子は「[[Call]] を持つObject型」の場合に "function" を返す
外部リンク:262.ecma-international.org
39
(2): デフォルトの名無しさん (スップ Sdc3-JVFl [1.72.7.185]) [sage] 2022/09/02(金) 16:08:14.77 ID:anBQQFEld(1) AAS
ブックマークレットのスレッドかこちらか悩みましたが質問なのでこちらでご相談させていただきます。

他者のWebサイトを閲覧する際、JavaScriptを用いて作成されている場合、リンクを新しいタブで開けない場面があります。
頻繁にページを進んだり戻ったりする場面、可能であればリンク先を別タブで開くようにしたいです。
ブックマークレットを用いて、現在ページのJavaScriptのリンクを別タブで開くように書き換える処理をすることは可能でしょうか?
40
(1): デフォルトの名無しさん (ワッチョイ a3b7-83Bc [211.124.165.35]) [sage] 2022/09/02(金) 16:38:05.47 ID:avuNeQJi0(1) AAS
>>39
そのサイト次第かな
クリックした後の画面を一発で開けるURLが用意されてたら基本的に実装できると思う
41
(4): デフォルトの名無しさん (ワッチョイ a52d-bBdM [220.100.64.9]) [sage] 2022/09/03(土) 00:11:31.61 ID:8AM/s+hA0(1) AAS
連想配列から特定のキーを検索して、重複がないもののみ取り出した配列を取得したいのですが、
このコードだと速度的に問題がありました。何か良い方法があったら教えていただけないでしょうか
const a= [
{'id': 1, 'category': 'animal', 'kind': 'dog'},
{'id': 2, 'category': 'fruit', 'kind': 'apple'},
{'id': 3, 'category': 'fruit', 'kind': 'orange'},
{'id': 4, 'category': 'animal', 'kind': 'dog'},
{'id': 5, 'category': 'animal', 'kind': 'cat'},
{'id': 6, 'category': 'fruit', 'kind': 'grape'},
]
var b=a.filter((x,y,z)=>z.slice(0,z.length).filter(w=>w.kind==x.kind).length==1);
console.log(b);
42
(1): デフォルトの名無しさん (ワッチョイ ad5f-wuTS [106.185.148.64]) [sage] 2022/09/03(土) 02:15:20.35 ID:Wm/0iruN0(1) AAS
>>41
const buckets = a.reduce((buckets, current) => {
if (!buckets[current.kind]) {
buckets[current.kind] = [current];
} else {
buckets[current.kind].push(current);
}
return buckets;
}, {});
const b = Object.values(buckets)
.filter((items) => items.length === 1)
.flat();

速度は測ってないけどたぶんO(n^2)→O(n)になって速いはず
43: デフォルトの名無しさん (スプッッ Sd03-5GnA [1.75.244.51]) [sage] 2022/09/03(土) 03:34:12.57 ID:E5gjC2rTd(1) AAS
Mapで似たようなこと考えてた
44
(2): デフォルトの名無しさん (ワッチョイ 3501-bBdM [126.94.243.226]) [sage] 2022/09/03(土) 10:05:53.47 ID:RJZpwhgn0(1/6) AAS
>>41
要素数や重複要素のばらつき具合によって結果は変わるが、最終的には力業が最速な事が多い
外部リンク:jsfiddle.net

極端な結果になっているのは重複要素がすぐそばにあり、while文による検索ですぐに見つかる為だ
重複要素が遠い位置にあるなら、while文による検索が遅くなるケースも十分にある

>>41のコードが比較的高速なのも重複要素が比較的近くにある為だ
Object.valuesやArray#filterによる変換コストが検索コストより高くついているので、他のコードが比較的遅い

重複検知が頻繁に発生するようであれば、データのも持ち方を new Map や new Set を使うように変更した方がいい
配列はユニークな値を得るのに向いていない
45: デフォルトの名無しさん (ワッチョイ 3501-bBdM [126.94.243.226]) [sage] 2022/09/03(土) 10:08:20.30 ID:RJZpwhgn0(2/6) AAS
>>44の補足
jsfiddleのconsoleはconsole.time()を実装していないようだ
ベンチマーク結果はブラウザのコンソールで確認する必要がある
46
(1): デフォルトの名無しさん (ワッチョイ 3501-bBdM [126.94.243.226]) [sage] 2022/09/03(土) 10:28:11.32 ID:RJZpwhgn0(3/6) AAS
すまん
>>44のwhile_loopは期待通りに動かないので忘れてほしい(console.assert()のコードをミスって気づかなかった)
重複要素のばらつき具合によるが、(>>41の配列においては)暫定最速は>>41
47
(1): デフォルトの名無しさん (ワッチョイ 3501-bBdM [126.94.243.226]) [sage] 2022/09/03(土) 10:46:53.92 ID:RJZpwhgn0(4/6) AAS
>>46
console.assert()の修正、重複チェックをkindのみに修正したら、mapが最速になった
外部リンク:jsfiddle.net
48: デフォルトの名無しさん (ワッチョイ 3501-bBdM [126.94.243.226]) [sage] 2022/09/03(土) 11:16:26.73 ID:RJZpwhgn0(5/6) AAS
>>47
高速化で考えるべきは「ループ回数の削減」と「変換回数の削減」

>>41 source
>>42 reduce
>>47 map

reduceはループ回数は削減されているが、変換回数がsourceよりも多い
要素数6では「変換コスト > 検索コスト」になってしまい、sourceよりも遅い
要素数192では「変換コスト < 検索コスト」となるので、sourceよりも速い

mapの変換回数は2回で Array.from() と results.values() のみ
ループ回数、変換回数ともにsource,reduceよりも少ない
要素数6、要素数192のいずれも map が最速となる

実際のところ、変換を一度も発生させないコードが理想となる
データの持ち方として配列(new Array)であるべきなのか、はよく考えた方がいい
49
(1): デフォルトの名無しさん (ワッチョイ 3501-bBdM [126.94.243.226]) [sage] 2022/09/03(土) 11:42:14.57 ID:RJZpwhgn0(6/6) AAS
>>39
a要素でマークアップされているなら、難しくはない

for (let a of document.querySelectorAll('a[href]')) a.target = '_blank';

window.open()などでリンクを開く挙動もJavaScriptで制御しているなら、コードを読んでリンク先を得る手段を考える必要がある
1-
あと 953 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.026s