+ JavaScript の質問用スレッド vol.124 +

■ このスレッドは過去ログ倉庫に格納されています
2021/11/10(水) 15:24:24.80ID:jxD2VXPG0
JavaScript を自ら学ぶ人のための質問スレッドです。
>>2-6のテンプレを読んだ上で質問してください。次スレは>>950>>2のテンプレ案(本スレで改善案があれば考慮)を元に立ててください

■質問を書く上で
(1) 煽り、コード制作依頼等、人を不快にさせる投稿はご遠慮下さい。公序良俗を守った応対を心がけてください。
(2) 他の人に迷惑をかけるスクリプトの質問はご遠慮ください。
  (ブラクラ、[戻る], [閉じる], [クリック] の妨害、画面占有など)
(3) 質問者及び議論を行う人はメール欄を空欄にし、名前にレス番を入れることを強く推奨します。回答者はなりすましを判断できませんので、なりすましが現れても自己責任となります。
(4) 常に自発的に調べる心構えを持ってください。
  具体的には「自分で調べてから質問する」「回答をもらってわからない単語があればGoogle検索してみる」など。
  わからない内容を代わりに調べてくれる回答者をお望みの方は余所で質問してください。
(5) 出来るだけ一般的な用語を使用してください。脳内オレオレ用語は混乱の元です。
(6) 出来るだけサンプルコードを掲示してください。言葉による説明は行き違いが生まれる場合があります。
  ※必ず「問題の事象が再現されること」を確認してください。
   必要な部分だけ切り出したつもりで現象が再現できていなかったケアレスミスがしばしば見られます。
(7) サンプルコードに HTML が含まれる場合は http://validator.w3.org/ で [Check] してみてください。
(8) 質問を具体的かつ詳細に書くと回答を得られやすいです。>>2の質問テンプレートを活用してみてください。
(9) ライブラリ関連の質問は禁止です。関連スレにあるライブラリ質問スレで質問して下さい。
(10) 時にはあなたが望む「答え」だけでなく、「意見」などが寄せられる場合もあります。

※前スレ
+ JavaScript の質問用スレッド vol.123 +
https://mevius.5ch.net/test/read.cgi/tech/1491143438/
VIPQ2_EXTDAT: checked:vvvvvv:1000:512:: EXT was configured
2022/02/23(水) 10:35:21.54ID:EjF360bu0
HTML部分

<!DOCTYPE html>
<html>
<head>
って書いてるから無理なんかな……index.htmlじゃなくて.cgi直のURLに設定したいんだけど……
2022/02/23(水) 11:28:37.94ID:hXi3IxJ40
>>521
こんにちは
cgiてのはperlのコトですかね
perlやPHPはHTMLをまるっと吐き出せるんですよ
だからjavascriptの仕掛けのあるHTMLをまず作ってみて、その内容をまるごとcgiでprint文などで出力します
2022/02/25(金) 20:59:11.76ID:zW9WpBq20
てst
2022/02/25(金) 20:59:52.69ID:zW9WpBq20
C#からJavaScriptをコールしたいのだが、このJavaScriptは.jsファイルに入れるのではなく、
htmlファイル内に書かないといけないのかな?
525デフォルトの名無しさん (ワッチョイ 1710-rCyD [180.12.82.129])
垢版 |
2022/03/06(日) 20:50:59.24ID:Ii2qDZic0
setIntervalでtimer1が起動中のときはtimer2を起動させないようにするにはどうやればいいんですか?
2022/03/06(日) 20:59:50.64ID:EBMcer04r
>>525
setIntervalのラップ関数を作って排他制御する
527デフォルトの名無しさん (ワッチョイ 1710-rCyD [180.12.82.129])
垢版 |
2022/03/06(日) 21:36:36.90ID:Ii2qDZic0
>>526
なるほどー
それとsetIntervalも戻り値は0になることはないのですか?
2022/03/06(日) 22:53:26.23ID:SX3V4D250
timer の状態を調べる、属性とかは無いの?
2022/03/08(火) 21:51:27.12ID:iL0h68YD0
>>528
返り値はただのNumber値
プロパティは埋め込めない
2022/03/08(火) 22:09:04.89ID:iL0h68YD0
>>527
戻り値は正の整数
2022/03/09(水) 08:20:41.91ID:U0qNtUpH0
数日前からjavascriptやらされてるんだけど質問
ajax関係の処理が例えばJqueryだと$.ajaxとかで終わった時の処理とか
エラーだったときの処理とかで分かれてるじゃない?
こういうAPIへのリクエストは全部まとめたいからsuccessにreturnするfunctionにしたら
使う側では瞬間帰ってきてundefinedになってしまう・・・
asyncなんだから当たり前だと言われたらそれまでなんだけど
そして毎回$.ajaxをそこら中で呼び出すことになる
これってそういう言語だからあきらめろしか無い感じ?
もちろんasyncをfalseにしろという話になりそうだけどブラウザがメインスレッドでやらんほうがいいとか警告出してくるし
2022/03/09(水) 08:38:01.00ID:6ktbAzhaM
よく分からんけどコードが間違ってるだけな気がする
2022/03/09(水) 09:30:24.96ID:Cs4PttVsr
>>531
awaitを使えば返り値でとれる
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/await

別スレで似た質問があったが、同一人物ではないよな?
https://mevius.5ch.net/test/read.cgi/hp/1478002550/499
質問者の応対が酷かった
2022/03/09(水) 10:14:14.84ID:U0qNtUpH0
>>532
>>533
ごめん色々試してみて自己解決したかも
$ajaxをfunctionに包んでたけど単にreturnするのがsuccessに与えてる無名関数へのreturnになってるからな気がした
その質問者はしらんけどそんなすれあるのねスレチならあっちいくわ

function getdata() {
$.ajax({
type: 'post',
url: 'aaaa',
contentType: 'application/json',
dataType: 'json',
success: function(jsondata) {
return jsondata;
});
}
呼び出し元
var a = getdata();
これでaがnullなのはasyncとかだと思ってたけどfunctionの返し先が無名関数だからだと思う
こういう場合javascript的にはどうするのが定石なの?
getdataの引数に結果を入れる変数渡すの?
2022/03/09(水) 10:18:12.60ID:Cs4PttVsr
>>534
PromiseかDeferredを使う
2022/03/09(水) 10:24:10.95ID:U0qNtUpH0
>>535
やばいこれおもしろいね
また世界が広がったわありがとう!
javascript始めてみて非同期処理の世界で頭おかしくなりそう
threadやforkとは微妙に違うおもしろさがある
2022/03/09(水) 10:59:23.57ID:de7whWW50
今時fetch使おうよ
2022/03/09(水) 11:12:57.49ID:HyI7NswaM
ブラウザ資源を独占できない以上非同期なのは仕方がない
隅っこに入れたWEB広告が通信するから描画スレッド止めますなんて言い始めたらぶん殴るわ
2022/03/09(水) 11:18:48.71ID:EGYBINjxM
>>531
強制されてるなら別だけど、とりあえずjQueryはヤメた方がいい
2022/03/09(水) 18:13:15.28ID:U0qNtUpH0
>>539
素?のJavascriptの方が良いって事かな?
ブラウザー対応考えたら楽だと聞いたけど動作対象がモダン環境なら気にしなくても良いとか?
2022/03/09(水) 20:06:52.37ID:2mwlDhCB0
>>540
caniuseやMDNで互換性を調べよう
https://caniuse.com/fetch
https://developer.mozilla.org/ja/docs/Web/API/Fetch_API#%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%83%BC%E3%81%AE%E4%BA%92%E6%8F%9B%E6%80%A7
2022/03/09(水) 20:17:36.42ID:BHHQkJq20
IE6ぐらいはサポートしとけ
長期デフォルトブラウザの実績は覆せない
2022/03/09(水) 20:24:49.60ID:2mwlDhCB0
>>542
MSのサポート期限を調べよう
https://www.google.com/search?q=ie6+%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E7%B5%82%E4%BA%86
2022/03/09(水) 20:30:03.00ID:bXFYtOtEM
>>540
IE対応するかしないかでほぼ決まる
お仕事ならお客さん次第
2022/03/10(木) 04:35:08.01ID:mUiYAuMC0
>>540
そうなんだありがとう
caniuseで見たら一番下の緑4個の行だけがターゲットだからfetchで良いんかな
Javascript=JQueryってのが当たり前になってるから意識変えれそうで良かった
2022/03/10(木) 16:41:12.37ID:QC1L9XJq0
>>545
対応ブラウザの問題がないならfetchで良いと思う
未対応ならPolyfillの選択肢もある
2022/03/11(金) 21:03:13.79ID:XGwo6uIj0
JavaScriptに「型」を 〜Microsoftが新構文を提案へ
https://www.google.com/amp/s/forest.watch.impress.co.jp/docs/news/1394/209/amp.index.html

これは気になる
仕様化されるのかね…
2022/03/12(土) 12:10:31.15ID:Nwo5BHml0
VScodeを使っていますが
この画面のカスタマイズはできますか
具体的には、ソース全体の縦長のビューがあってそのうち今見ているところが少し明るく表示されてますよね?その色が分かりにくい!
つかんでドラッグしたくても見つけにくい!
もっとハッキリした色にできますか
2022/03/12(土) 12:37:17.47ID:ilfolIlBM
>>548
Visual Studio Code / VSCode Part11
https://mevius.5ch.net/test/read.cgi/tech/1632311131/
550デフォルトの名無しさん (ワッチョイ bd10-pPbi [180.12.82.129])
垢版 |
2022/03/12(土) 18:02:33.03ID:gZ07u/du0
<html>
<head>
<meta charset="UTF-8">
<title>てすと</title>
</head>
<body>

<スクリプト>
for(let n=1;n<=300;n++){
let str = "<p>" + n + "</p>";
document.write(str);
}
alert(document.body.clientHeight);
alert(window.innerHeight);
</スクリプト>

</body>
</html>
ページ全体の高さを求めたいけどdocument.body.clientHeightで
695と表示されウィンドウの高さと同じになってしまいます。
どうすればちゃんとページの高さが求まりますか?
2022/03/12(土) 21:32:42.84ID:9cczQYeA0
web 系の質問は、web制作管理板の方のスレで聞いてください!

この板のスレは以前、荒らしが出た時に、緊急避難用に立てたもので、
本来はweb制作管理板の方です
2022/03/12(土) 21:36:30.85ID:5XddXhdb0
>>550
document.body.scrollHeight
document.documentElement.clientHeight
2022/03/12(土) 22:58:01.42ID:iDbN5UB10
>>551はただのコピペなので気にしないように
Web制作板の現状は>>213,253
2022/03/12(土) 23:28:29.22ID:9cczQYeA0
ここはプログラム板

HTML, DOM, CSS/SASS や、ブラウザ・サイトのページの知識などは、
web制作管理板の方がよい。ウェブ制作

それ以上のフレームワークなどは、WEBプログラミング板。ウェブ開発

YouTube で有名な、雑食系エンジニア・KENTA の本でも、
ウェブ制作はフロントエンド・コーダー、
ウェブ開発はバックエンド・SE みたいに、異なる分野となっている
555デフォルトの名無しさん (ワッチョイ bd10-pPbi [180.12.82.129])
垢版 |
2022/03/13(日) 00:51:37.82ID:zkh0XZKF0
>>552
ありがとう
<!DOCTYPE html>をつけたらdocument.body.clientHeightで取得できるようになりました。
556デフォルトの名無しさん (ワッチョイ 9d01-m3T3 [126.126.240.1])
垢版 |
2022/03/13(日) 15:40:27.22ID:jxSWNPd90
オブジェクトの中で別のプロパティを参照するのはどうすればいいのでしょうか?
thisを使うとundefinedが返ってきて、thisを付けないとまだ定義されてないと
エラーが出ます。下記の例だとsideSpaceを参照したいのですが
うまくいきません。

const sp = {
width: 640,
sideSpace: 20,
space: this.sideSpace * 2,
inner: this.width - this.space,
}
2022/03/13(日) 15:48:53.49ID:MhWbhXb10
>>556
getterかProxyを使えば良い
558デフォルトの名無しさん (ワッチョイ 9d01-m3T3 [126.126.240.1])
垢版 |
2022/03/13(日) 17:18:48.53ID:jxSWNPd90
書き直してみたんですがやはりgetSpace()が未定義エラーが出てしまいます。

const sp = {
width: 640,
sideSpace: 20,

get getSpace() {
return this.sidespace * 2;
},

space: getSpace()
};
2022/03/13(日) 17:25:30.15ID:gKsfpaAq0
>>558
const sp = {
width: 640,
sideSpace: 20,
get space() { return this.sideSpace * 2; },
get inner() { return this.width - this.space; },
};
console.log(sp.space); // 40
console.log(sp.inner); // 600
2022/03/13(日) 17:26:15.54ID:MhWbhXb10
>>558
spaceとinnerをgetterにすれば良い
2022/03/17(木) 19:32:02.34ID:v8AF8giY0
関数の引数にオブジェクトを使ってる時要素を固定する方法ってある
例えば

function main(obj){
obj.a;
obj.b;
}

みたいなときaとbだけの要素を受け入れたいんだけど
2022/03/17(木) 19:36:12.35ID:v8AF8giY0
一応その要素があるかで判断して返すって方法はわかるどそれ以外でシンプルな感じで出来ないかなと思って
2022/03/17(木) 19:38:09.18ID:N96K+gAsM
理解できないから適当に答えるが
objに必要なメンバーだけを抽出複製するメソッドを作ってみては?
2022/03/19(土) 14:30:35.47ID:ZaiWDhWv
aysncとawaitで頭がこんがらがってきました

function sleep() {
return new Promise(resolve => {
setTimeout(()=>resolve(),2000);
});
}

async function run(x) {
var a = await sleep();
var b = await sleep();
return x;
}
run(10).then(v=>console.log(v));
//これは4秒後に10と表示されます
//しかし、、

async function run2(x) {
var a = sleep();
var b = sleep();
var _a=await a;
var _b=await b;
return x;
}
run2(20).then(v=>console.log(v));
//これは2秒後に10と表示されます

//一体なぜ・・
var _a=await a; //ここで2秒待ち、
var _b=await b;//ここで2秒待ち、
だと思ったのですが・・・
2022/03/19(土) 14:37:22.28ID:TKJ0fISW0
>>564
遡ってのawaitは不可能
2022/03/19(土) 14:47:10.12ID:zP5GoGcDM
>>564
Promise内の処理がいつ開始されるのかを考えてみれば?
2022/03/19(土) 15:19:23.16ID:ZaiWDhWv
>>565,566
なるほど・・?

runの方では
var a=await sleep()のタイミングで返り値Promise内処理がされてresolve()されるまで(2秒)待ち、
次いでvar b=await sleep()の計4秒
これはしっくりくるのですが

一方、run2の方では
var a = sleep();
var b = sleep();
の段階ではPromise内処理は実行されませんがa,b共にPromise格納
var _a=await a;のタイミングでawait Promise
次いでvar _b=await b;await Promise
だと思っていましたが
>遡ってのawaitは不可
つまり一度変数に格納した場合はrun1のようにはならず、非同期で_a,_b時にPromise内処理がされる
ということでしょうか

run2のようなパターンはあえてそういう処理として使っていいのか、それとも
基本的に変数とかに置かずにawait Promiseした方がいいのか
まだちょっとよくわかりませんがスッキリしました
ありがとうございます
2022/03/19(土) 15:33:49.12ID:DtRySdf10
runのパターだと非同期ではあるが直列動作
run2はsleepとawaitの間に別の処理を置いたり並列的な動作ができる
どっちがいいかはケースバイケース
2022/03/19(土) 15:41:31.50ID:VcAQVTiir
そもそもそんな使い方するな
2022/03/19(土) 16:13:33.28ID:RNh01PsRM
同期関数の使い方や処理タイミングはともかく、run2(20)としておきながらコンソールに10と出るのはおかしい
2022/03/19(土) 16:25:28.50ID:ZaiWDhWv
asyncとawaitのくだりでついでにもひとつ質問です
function sleep(x) {
return new Promise(resolve => {
setTimeout(()=>resolve(),x*1000);
});
}
async function run1(){
console.log("run1 start");
await sleep(5);
console.log("run1 end");
}

async function run2(){
console.log("run2 start");
await sleep(2);
console.log("run2 end");
}
function run(){
run1();
run2();
}
run();

これはrun1(),run2が非同期処理されて
狙った意図になりました
そこで今度はrun1()が処理しきったあとにrun2()を処理したい
つまり、run1 endと表示されてからrun2 startが表示されて
みたいな同期処理をしたいなと思いました
コールバックすれば簡単なのでしょうがせっかくなので
awaitとか活用した感じで書いてみたくrun1のとこにPromiseを返したりしてみましたが無限ループでブラウザが固まりました
何かいい案はありますでしょうかよろしくおねがいします
2022/03/19(土) 16:32:40.17ID:ZaiWDhWv
改めてやってみたらできました
おそらくブラウザがフリーズしたのはrunとrun1を間違えてたようです
成功したのはこれです↓
こんな感じで合っているのでしょうか

async function run(){
await new Promise(resolve=>{
resolve(run1())
});
run2();
}
run();
2022/03/19(土) 16:40:03.87ID:DtRySdf10
asyncな関数はPromiseを返すので
async function run(){
await run1();
run2();
}
2022/03/19(土) 16:46:15.37ID:ZaiWDhWv
>>573

なるほど
なんかわかってきた気がします・・!
ありがとうございます
2022/03/19(土) 17:13:19.06ID:VcAQVTiir
他人がみてわからん書き方すんなよ
2022/03/19(土) 17:41:45.59ID:ZaiWDhWv
やりたいことはざっくり>>571を例にすると
run1やrun2は非同期、同期どちらでも使えるようにしておいて
awaitするときは同期、しないときは非同期
という感じなのですが
他人からみてわかりにくいですかね・・?

もちろんrunの名前と中身によりますが
run1();
run2();
↑これは非同期だろうな
await run1();
console.log("途中");
await run2();
console.log("最後");
↑awaitついてるから同期だろうな
みたいに直感的にフローがわかるように思うのですが
もしかしてバグ生みそうな何かがあるのでしょうか
2022/03/19(土) 17:44:55.70ID:ZaiWDhWv
補足
run1,2自体は非同期ではない?ですね
run1,2内のawaitの部分が非同期なだけであって
そこら辺、中身みないとわかりにくいですかね
2022/03/19(土) 18:31:46.85ID:TKJ0fISW0
>>571-572
回りくどい処理しか見えなくて、その書き方をする意図の理解に苦しむ
run1とrun2をPromise化してPromise.all()ではダメなのか?
2022/03/19(土) 20:13:47.31ID:ZypCz9jZa
コールバック関数入れ子呼び出し地獄

Promise then数珠繋ぎ地獄

async await
と書き方が変わって来たのでPromise thenとasync awaitを混ぜて書くのはおかしい。
使いやすい方を使えば良いと思うけど非同期処理で取得したデータをいくつも使う場合はasync awaitで書いたほうがスッキリ書けるよ。
Promise thenみたいだとthen途中まで中途半端に行コピペするミスとか起きる
2022/03/19(土) 20:20:09.04ID:ZaiWDhWv
>>578
ありがとうございますやってみました
function sleep(x) {
setTimeout(()=>console.log("sleep",x),x*1000)
}
function msg(n){
console.log(n)
}
function run1(){
return new Promise(resolve=>{
msg("run1 start");
sleep(3); //この非同期処理を同期処理にしたい
msg("run1 end");
resolve("run1 success");
})
}
await Promise.all([run1()]).then(result=>{console.log(result)});

がsleep(3)のとこが非同期になってしまいます・・
2022/03/19(土) 21:34:54.50ID:ZypCz9jZa
awaitはasync関数内でしか使えないよ
2022/03/19(土) 22:45:17.97ID:ZaiWDhWv
>>581
たしかにそうでした・・
とりあえずすべてpromise化してnew Promise内にPromiseとかやってみましたが
うまくいかず・・
>>579
そういう系譜があったのですね

とりあえず現状はうまくいっているasync awaitでやってみます
ありがとうございました
2022/03/20(日) 07:50:06.50ID:8bwKUIJnr
もうめちゃくちゃだなw
そもそも何をしたいのかすらわからなくなった
2022/03/20(日) 09:48:36.58ID:98wGNFjK0
横からすみません!
async や await は関数の頭だけに付けれる認識でしょうか
単なるメソッドの前にawaitをつけれないんですね
たとえばアラート1と2がテレコにしたくないからといって下記のような書き方は不可ということでよいでしょうか


async hoge(){
await alert("1");
alert("2");
}
2022/03/20(日) 11:26:58.56ID:4y0+fo7i0
>>584
async function hoge() {
await alert('1');
alert('2');
}
2022/03/20(日) 11:44:24.57ID:ZsjWra1g0
http://newmofu.doorblog.jp
このサイトなんですが、RSSはjavascriptで取得しているんでしょうか?
2022/03/20(日) 13:15:28.93ID:JFBEbRfA0
>>584
classメソッドはそんな感じでok
でもそのalertがwindow.alertなのだとしたらawaitは無意味
2022/03/20(日) 15:09:47.81ID:98wGNFjK0
>>587
えっ?つまりメソッドにもawaitはつけれるんですかね
いちいちfunctionを小分けにする必要のないこともあるんですね
2022/03/20(日) 17:25:10.29ID:SwEbiGVb
クラス内で実行中のメソッドを多重実行したくないとき
みなさんはどうしていますか

class hoge{
constructor(){
this.isStreaming=false;
}
stream(){
if(this.isStreaming){
console.log("実行中");
return
}else{
this.isStreaming=true;
console.log("実行");
}
const self=this;
//何か実行中...
setTimeout(()=>{self.isStreaming=false;console.log("終了")},3*1000);
}
}
var h=new hoge();
h.stream();
h.stream();
setTimeout(h.stream,5*1000);

これだと仮にstream1,2,3..と増えていったらisStreaming1,2,3...と増えていくと思うのですが
そういうのを回避するうまいやり方とかあるのでしょうか
2022/03/20(日) 17:38:27.19ID:SwEbiGVb
補足 クラス内というかインスタンスで、でした
591sage (ワッチョイ c701-3UDB [126.3.43.63])
垢版 |
2022/03/20(日) 17:49:26.68ID:OSPfEuDk0
>>589
例えば、クロージャを作って、メソッドのステータスをクロージャ内に格納させるとか。

class hoge {
stream(){
let isStreaming = false;
return function() {
if(isStreaming){
console.log("実行中")
}else{
isStreaming = true;
console.log("実行")
setTimeout(() => { isStreaming = false; console.log("終了") }, 3 * 1000);
}
}
}
}

let h = new hoge();
stream = h.stream();
setInterval(stream ,1000);
2022/03/20(日) 17:56:19.09ID:SwEbiGVb
>>591
おぉ、なるほど!!
参考になります
2022/03/20(日) 18:00:23.47ID:2Ue7hGfR0
>>589
WeakMapでプライベートプロパティを作る
https://www.google.com/search?q=weakmap+%E3%83%97%E3%83%A9%E3%82%A4%E3%83%99%E3%83%BC%E3%83%88
2022/03/20(日) 18:25:56.74ID:SwEbiGVb
>>593
WeakMapオブジェクトなんてものがあるのですね
これだと大量に扱う場合は便利かもしれません
ありがとうございます
2022/03/20(日) 19:15:48.99ID:OSPfEuDk0
>>592
functionを引数で受け取れるようにするといいかもしれない。

class hoge {
makeStream(f){
let isStreaming = false;
return function() {
if(isStreaming){
console.log("実行中");
}else{
isStreaming = true;
console.log("実行");
f();
setTimeout(() => { isStreaming = false; console.log("終了") }, 3 * 1000);
}
}
}
}

let h = new hoge();
stream1 = h.makeStream(()=>{console.log("なんかの処理1")});
stream2 = h.makeStream(()=>{console.log("なんかの処理2")});
2022/03/20(日) 19:54:06.60ID:SwEbiGVb
>>595
なるほど
これなら分けて管理しつつ多重実行禁止メソッドを量産できそうですね
ありがとうございます!
2022/03/20(日) 22:45:44.89ID:aLyHOWc60
>>586
サイト分析なら、ここで

https://builtwith.com/
2022/03/20(日) 23:28:24.98ID:1AhGKhB60
今月くらいからyoutube動画埋め込んだページのdev toolコンソール見るとservice workerが大量のエラー吐くようになったんだが
jsでクライアント端末側でどうにかできる?
2022/03/21(月) 01:01:24.11ID:avj/Dp0k0
何かのサービスが終わったとか?
やり方が変更されたとか?
2022/03/24(木) 20:37:07.86ID:0pE5eZuk
var ary=["a","b","c"];
for(let i in ary){
if(i===0){ continue }
console.log(i,typeof i,"int違う・・")
}

for inの罠にハマってしまいました
こういうiも取りたいときってforEachだったり
配列のlengthとってforで回したりの方がいいんですかね?
2022/03/24(木) 20:55:28.38ID:IVltSCqHM
>>600
>>iも取りたいとき

何が言いたいのかさっぱりわからん
コードの目的(期待するログ表示)を明示しよう
2022/03/24(木) 20:55:55.62ID:y95b8UUh0
ixを用意してまわしてもいいし、オブジェクトの
entries 使ってfor ofでまわしてもいい。

正直超些細なことでどっちでもいい。
2022/03/24(木) 21:37:28.49ID:puY9Jz2N0
>>600
インデックス値のプロパティはString型
int型というものはない

最も、i=1のfor文で十分に読めるがね…
2022/03/24(木) 21:49:07.67ID:0pE5eZuk
>>601
わかりませんかね?
そんな難しいことは書いてないと思うのですが・・

>>602,603
なるほど、array回すときの何か慣習があるのかなと思い質問しました
600例のary程度ならfor(let i in ary){
i=i-0;であえて数値に変換するか、if(i==0)にするか
とかしようと思っていましたが素直に
for(i=1;i<ary.length;i++)的な書き方で行こうかなと思います
ありがとうございました
2022/03/24(木) 22:04:46.78ID:puY9Jz2N0
>>604
疎な配列を考慮する場合、for文とhasOwnPropertyを併用する必要がある

配列でfor-in文を使うと他で拡張されたプロパティも拾うので、理由がなければお勧めしない
keysやentriesからsliceしてfor-ofでも良い
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/keys
2022/03/24(木) 22:09:38.34ID:puY9Jz2N0
keysやentriesからfor文の方がスマートか
2022/03/24(木) 22:40:29.47ID:0pE5eZuk
>>605-606
なるほどいろんな書き方がありますね
配列の値回すだけの目的にfor-in文だとトラブルとかパッとみ可読性落ちる気もするので辞めといたほうが良さそうですね
ありがとうございました
2022/03/24(木) 22:56:29.50ID:I4v/4Eugr
for-inは非推奨
2022/03/25(金) 00:35:38.75ID:St3aQ5GC0
>>608
for-inは仕様上、非推奨じゃない
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/for...in

prototype拡張したコードを考慮してないコードでバグを誘発させるだけ
https://www.google.com/search?q=for-in+prototype%E6%B1%9A%E6%9F%93
理解して使う分には問題ないが、コーディング規約で縛られていれば使えないし、チーム内に初心者が一人いるだけでバグを作り込むリスクがある

Object.keys() 等の他のプロパティ列挙機能で要件を満たせるなら、for-inを使う理由はない
要件を見直してみれば、ほとんどの場合にfor-inを使う必要がないことが分かるはずだ
2022/03/25(金) 02:03:31.28ID:Yg2YvIk20
if (++score == 10)
if (score == 10)ならばわかるのですが、
ここに++が加わることでどのような意味になりますか?
2022/03/25(金) 02:20:07.52ID:IB939EjQM
>>610
評価前にscoreの値が+1される

インクリメント (++) - JavaScript | MDN
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Increment
2022/03/25(金) 03:35:53.60ID:Yg2YvIk20
>>611
ありがとうございます!
2022/03/25(金) 22:15:14.80ID:mxqYNiam0
async/awaitのことですが

await hoge();

としたときに、hogeが実行される前に何かを待つのか、
それともhogeが実行されその完了を待つのか、
どちらでしょうか

それと、promiseを返す関数かそうでないかはどうやって見分けますか
2022/03/26(土) 00:51:31.77ID:m2MNxml2M
async関数は記述は普通の関数だけどPromiseを返す関数。awaitは完了を待つ
2022/03/26(土) 08:38:54.66ID:gURe/O9Rr
awaitは「あ、待って」って覚えるとよい
2022/03/26(土) 09:09:03.44ID:KPWAIzDZa
完了を待つには待つけど
何を以て完了とするかはそれぞれの関数が決めること
見分ける方法は無いしそもそも得体の知れない関数を使っちゃ駄目
2022/03/26(土) 10:06:13.85ID:PyuIzITI0
こんにちは>>613です
蒸し返しですみませんが
awaitをつける行じたいがapiなどの重い処理なんですかね
それともawaitはthenのような意味で処理を待つ行なんですかね
つまりawaitは待つ側なのか、待たされる側なのか、という質問です
2022/03/26(土) 10:17:45.12ID:m2MNxml2M
awaitは非同期処理の完了を待つ。非同期処理を順次実行する時に使う。
処理待ちでブラウザが無反応にならないようにする目的ならsetTimeoutとかsetIntervalとかWeb Workers使うんじゃないかな
2022/03/26(土) 11:57:59.24ID:PyuIzITI0
>>617で書いた、「待つ側」と「待たされる側」てのは同じ意味でしたねw
待つ側なのか、待たせる側なのか、という質問です
2022/03/27(日) 05:19:16.05ID:FEuFUFUF0
>>581
Top-level Await
従来、JavaScriptのawaitはasync function内でしか使えなかったが、
今後はasync functionの外、top levelでもawaitが使えるようになる
ES2022より
2022/03/27(日) 15:29:56.04ID:M7t4c+zh
クロージャーであるsetter,getterを持つクラスを作ったのですが
クロージャーをセットするときにパラメーターを渡したいとき、どうすればいいのでしょうか

class Hoge{
constructor(){
this._f=null;
}
set f(f){
this._f=f();
}
get f(){
return this._f;
}
}
const h = new Hoge(10,20);
h.f = function(){
let r=0;
return {
sum:(a,b)=>(r+=a+b),
r:()=>console.log(r)
}
}
h.f.sum(1,2);
h.f.sum(3,4);
h.f.r(); // 10

↑はこれで良いのですが、例えば
h.f = function(m){
let r=0;
return {
sum:(a,b)=>(r+=(a+b)*m),
r:()=>console.log(r)
}
}
みたいにパラメーターmを渡したいです
しかし、setterには引数1つしか渡せないので詰みました。
かと言って
f(f,prms={}){ this._f=f(prms) }
get f(){}
はできません
setter,getterを使わずに、一時保存的な変数を増やしてゴリゴリ書くしかないでしょうか
つづく
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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