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

■ このスレッドは過去ログ倉庫に格納されています
2018/04/16(月) 00:09:43.45ID:???
JavaScript を自ら学ぶ人のための質問スレッドです。
次スレは>>950が(本スレで改善案があれば考慮して)立ててください

■規則/推奨ルール
・メール欄を空欄にし、名前にレス番を入れることを強く推奨(なりすまし防止)
・質問内容は具体的に。言葉だけでなく、出来る限り再現性を確認したサンプルコードの掲示。
・質問テンプレートの利用推奨。
・質問への「答え」だけでなく「意見」を出しても良い。

■禁止行為
・丸投げ質問
・迷惑スクリプトの質問
・オレオレ用語の使用(一般的な用語を使用する事)
・煽り、批判等の他人を不快にさせる行為(批判の代わりに「AよりBが良い」のような代案を出す事)

■質問テンプレート
【環境】OS, ブラウザをバージョンと共に記入してください。
【条件】期待する回答の条件を書いてください。
【何をしたのか】何をしたら問題の現象が発生するのか。再現手順を具体的に書いてください。
【エラーメッセージ】エラーメッセージがあれば正確に書き写してください。
【期待する結果】最終的にどういう結果を望んでいるのか、を書いてください。
【サンプルコード】現象を再現可能な最小限のコードを書いてください。
 1レスに収まらないならコード投稿サイトを利用してください。
 http://jsdo.it/ http://jsbin.com/ http://jsfiddle.net/ http://ideone.com/

■回答者へ
・回答には多様性があります。他人の回答を尊重してください
・動作ブラウザや環境が限られる場合は、それを明記してください
・他人の回答を批判する代わりに、自分ならこう書くという例を示してください
・質問者がJavaScriptでなければ実現できないと勘違いしてるなら、その否定としてHTMLとCSSで実装しても良い
・他人の回答を見たくないのであれば、文句をつける代わりにNGにして見えないようにしてください。文句をつける=荒らしです
2018/05/18(金) 06:19:08.20ID:???
const には「再代入不可」以外の意味はないからね
プロパティの更新も禁止したいなら
Object.defineProperty とか Object.freeze
2018/05/18(金) 17:21:46.36ID:???
>>558-560
use strict宣言ではvarの代わりにconstを使う、みたいなのを見たのでてっきり変数宣言の主軸なのかと思っていました
>>561
なるほど(エラーは設定しないといけないみたいですが)そういう関数があるのですね
2018/05/18(金) 18:58:08.98ID:???
constを基本にするのは別に悪いことじゃないよ
必須かと聞かれると自分はletばかりだけど
564Name_Not_Found
垢版 |
2018/05/18(金) 19:35:55.40ID:rKRag9JE
TDZのクソ挙動が気に入らないのでvarです。
functionスコープで特に問題ない。
大規模開発するなら使うけど。
しないなら必要ない。不便なだけだぞ。
2018/05/18(金) 21:06:39.05ID:???
それ本当にTDZの挙動に不満持ってるのか?
再宣言禁止で
let a = hoge
と次の
a = fuga
が揃わないとかならまだ少し分かるが
定義場所前でのundefinedを期待する必要性なんてまず無いだろう
2018/05/18(金) 23:26:18.45ID:???
TDZは重宝してる
2018/05/19(土) 02:25:49.15ID:???
fromってどういうとき使うの・・?

var arr=['kyoto','oosaka'];
console.log(Array.from(arr, n=>`${n}-fu`).join(", "));
console.log(arr.map(n=>`${n}-fu`).join(", "));

mapでいいじゃん・・みたいな
2018/05/19(土) 02:34:37.26ID:???
配列風オブジェクトを配列に変換したい時に使う
569Name_Not_Found
垢版 |
2018/05/19(土) 13:30:15.68ID:TKsYmqdA
[...配列風オブジェクト]でいいじゃん
2018/05/19(土) 17:23:00.70ID:???
>>569
配列風オブジェクトにスプレッド演算子が使えるとは限らないんだが

実際にEdgeでNodeListにスプレッド演算子は使えない。
古いChromeとかも使えないようだ。
2018/05/19(土) 18:31:51.94ID:???
古いブラウザ持ち出したらfromも使えないじゃん
572Name_Not_Found
垢版 |
2018/05/19(土) 18:36:57.78ID:O/Yxf4Ui
fromはpolifilでできる
スプレッド演算子はbabelで使えるようになったとしても
NodeListでは使えない
2018/05/19(土) 18:55:29.64ID:???
だったらアロー関数もletもconstもトレイリングカンマも使うなよ
2018/05/19(土) 19:12:45.53ID:???
ぶっちゃけ必要が無い限り使わんなあ
2018/05/19(土) 19:38:52.11ID:???
>>573
babelで変換可能なものは使うよw
2018/05/19(土) 21:28:56.72ID:???
>>572
Symbol対応していればポリフィル可能だよ

NodeList.prototype[Symbol.iterator] ≒ Array.prototype.values
だから
2018/05/19(土) 21:32:49.32ID:???
>>568
iterableでない配列likeオブジェクトに対応できない
578577
垢版 |
2018/05/19(土) 21:35:39.93ID:???
>>577は>569宛
2018/05/20(日) 14:37:34.10ID:???
そういうツッコミは感心しないな
この靴は山を登るときに使う
いや、エベレストに対応できない
みたいな
2018/05/20(日) 16:43:05.57ID:???
熊の毛皮はあんまり寒いと役に立たないらしい。そういうときは犬の毛皮を使うそうだ。
なんだ、熊の毛皮つっかえねーな
2018/05/20(日) 17:29:49.09ID:???
じゃああんまり寒いと熊、絶滅しちゃう?
2018/05/20(日) 18:13:12.78ID:???
>>579
この場合は、Array.fromは不要というニュアンスへの反論だからおかしくはないと思うが
2018/05/20(日) 19:21:02.36ID:???
>>581
熊には体脂肪という毛皮をサポートするものがあるから大丈夫
2018/05/20(日) 19:37:28.85ID:???
俺にも脂肪はたくさんついているが?
2018/05/20(日) 20:40:15.97ID:???
髪の毛がついてないから寒さに弱いんだよ
2018/05/21(月) 18:45:07.49ID:???
暇つぶしに姉妹スレもよろしくおねがいします

+ JavaScript のお題用スレッド +
https://mevius.5ch.net/test/read.cgi/hp/1526666703/
2018/05/21(月) 21:14:25.17ID:???
スマートホン
スマフォ
2018/05/21(月) 21:18:23.96ID:???
セマフォ
589Name_Not_Found
垢版 |
2018/05/21(月) 23:41:14.10ID:N1KmZ/qF
全くの初心者ですが、
便利なウェブサービスを作りたくてJavaScriptを勉強しはじめました。

質問ですが、
ブログによく貼ってある、
カエレバ、ヨメレバってJavaScriptでできているのですか?
2018/05/22(火) 00:58:13.06ID:???
カエレバ.comそのものがどうやってできている、という意味なら
カエレバは、amazonや楽天などそれぞれのアフィリエイトパーツのルール(やテンプレート)に則った
アフィリエイトリンクを生成するサービス >>589

カエレバ利用者がブラウザからアフィID情報など打ち込んだとき
動的にアフィリンクを生成する処理部分で、少なくともJavaScriptが使われている
(ようはjavascriptを使った穴埋め問題)

あとは各サイトのテンプレートを一旦kaereba.comのサーバーサイドで処理のため
ここではphpが使われてるぽい
仮に、アフィIDによって商品IDそのものもが変わってしまうなら
各サイトへリクエストする必要がある
(ただほとんどのアフィリエイトパーツは穴埋め問題みたいなテンプレだろうが)

穴埋め問題だけなら、フロントエンドだけのjavascriptで実現できるし
極端に言えば個人使用なら文字通りテキストエディタで穴埋め問題すればいいだけ

もしリクエストする必要があるなら
・各サイトのレスポンスがクロスサイトに対応している、ならjavascriptだけで可能
・対応していなければ、phpやNode.jsみたいなサーバーサイドでの処理が必要
・対応しておらずサーバーサイドも嫌なら、ブラウザなどフロントエンドの設定を変える
など、この辺りがポイント
2018/05/22(火) 01:28:37.89ID:???
質問ですが、
ブログによく貼ってある、
ビックカメラ、ヨドバシってJavaScriptでできているのですか?
2018/05/22(火) 02:24:52.55ID:???
質問ですが頭によく貼ってある
2018/05/22(火) 02:26:11.46ID:???
地毛にきまっとるだろーが
2018/05/22(火) 02:51:33.73ID:???
JigeScript
2018/05/22(火) 04:52:54.78ID:???
Selectionオブジェクトでは
始点をanchor、終点をfocusと呼んでいます
anchor=碇なのは、選択開始部分を「そこに留める」ことからの発想だと思います
そう考えると、必ずしも始点が前、終点が後ろにあるとは限らないってことですよね?
文字選択というものは一般的にそうですし。
一方Rangeオブジェクトでは始点をstart、endと呼んでいます
この場合は始点が前、終点が後ろ(あるいは始点=終点)と保証されているということでしょうか?
2018/05/22(火) 05:11:56.81ID:???
>保証されている
少なくとも仕様ではそう。
例えば start を end より後に設定しようとすると end も変更される
2018/05/22(火) 05:20:24.05ID:???
>>596
そうなのですね
ありがとうございます
2018/05/22(火) 06:06:14.54ID:???
そもそもLtoRとRtoLが交じってることもある文字列で頭と尾を一般に定義することは出来ない
一応の挙動は決まっていても人間の尺度で保証されていると考えると痛い目にあうぞ
2018/05/22(火) 07:11:24.49ID:???
> そもそもLtoRとRtoLが交じってることもある文字列で頭と尾を一般に定義することは出来ない

どちらでも、頭は上で、尾は下だろ。
2018/05/22(火) 07:16:35.64ID:???
RtoLって言っても、要素の前後関係が変わるわけではないのでは?
たとえばrangeの先頭から末尾まで舐める処理は、LtoRだろうがRtoLだろうが同じように動作しますよね
2018/05/22(火) 09:08:41.33ID:???
いずれにしても、見た目上は左が前で右が後だけど、ここでいわれる「前」と「後」は 前(previousSibling) と後(nextSibling)?
DOMノードレベルとブラウザに描画されるレベルでは、前後の定義が変わるのでは?
2018/05/22(火) 10:44:30.80ID:???
RtoLで2要素跨いでる場合はどういう順番になるんだろう
2018/05/22(火) 13:28:48.90ID:???
>>601
なに言ってるんだ? 先に現れたのが前だろ
2018/05/22(火) 13:35:57.83ID:???
先って?
2018/05/22(火) 14:05:37.24ID:???
メモリアドレスの小さい順だが?
2018/05/22(火) 19:04:47.97ID:???
ファイルにしろDOMにしろ本質的にはシーケンシャルなのですよね
2018/05/23(水) 03:23:27.09ID:???
チェーンの数を動的に変更したいのですがどうすればいいでしょうか。
func(){
hoge.a().a().a().a();
}

このa()をfunc(1)のときは1回で実行結果が
hoge.a();

func(2)のときは3回で実行結果が
hoge.a().a().a();

みたいにやりたいのです
2018/05/23(水) 03:25:33.12ID:???
もちろん
func(n){
switch(n){}
}
的なのは考えましたが
例えばnが大きくなると大変になりそうなので
2018/05/23(水) 03:26:21.53ID:???
訂正>>607
>func(2)のときは
func(3)のときは

でした
2018/05/23(水) 03:55:47.58ID:???
再帰でなんとかするほうが良くね
2018/05/23(水) 05:46:05.97ID:???
>>607
単純なループで良い
難しく考える必要はない

func(n){
 var o = hoge;
 for (var i = 0; i < n; i++) {
  o = o.a();
 }
 return o;
}
2018/05/23(水) 06:41:36.97ID:???
難しく考える必要はない
せっかくJSを使ってるのだからこれでいい
eval( 'o'+'.a()'.repeat(n) )
2018/05/23(水) 07:44:19.05ID:???
難しく考える必要はない
単純にreduceでいい

func(n) {
Array(n).fill().reduce(acc => acc.a(), o);
}
2018/05/23(水) 08:00:17.68ID:???
いろいろ間違えた

function func(n) {
Array(n).fill().reduce(acc => acc.a(), hoge);
}
2018/05/23(水) 09:59:42.66ID:???
でもreduceってIE9からしか使えないしな。
fillとか存在の意味が分からんし

そんなに一行で書きたいなら

func(n){
 for (var i = 0, o = hoge; i < n; i++) o = o.a()
}
2018/05/23(水) 10:00:58.23ID:???
func(n){
 var o = hoge, while (n--) o = o.a();
}
2018/05/23(水) 10:41:20.18ID:???
そんなこと言ってもIE9なんてもはや気にしてないし。
サポート切れて喜んでたじゃんお前ら。
2018/05/23(水) 10:44:54.81ID:???
fillが嫌ならこんなのでもいいぞ。

function func(n) {
[...'.'.repeat(n)].reduce(acc => acc.a(), hoge);
}
2018/05/23(水) 11:07:15.87ID:???
またbabelをつかわないといけないようなコードを
2018/05/23(水) 11:54:18.14ID:???
またIE9おじさんか
2018/05/23(水) 13:16:49.98ID:???
hoge.b = function(n){
for(var i = 0; i < n; i++){
this.a();
}
return this;
};
?
2018/05/23(水) 13:24:02.79ID:???
>>618
ドット好き過ぎwww
2018/05/23(水) 13:24:51.85ID:???
>>614
単純とはいえない
reduce使いたいが為に配列をわざわざ生成して、生成した配列を捨ててる
2018/05/23(水) 13:28:22.51ID:???
>>615
MSは既にIE10以下を切り捨ててるけど、あなたのサポート対象はどこまで?
2018/05/23(水) 13:29:46.91ID:???
>>623
>>612は良いのか?ダブスタじゃん?
2018/05/23(水) 13:40:34.36ID:???
>>625
>>612は生成した文字列を捨てずに活用してるから、なくはないんじゃないかな
Function() の方がいいとは思うけど

どこがダブルスタンダード?
2018/05/23(水) 15:33:43.75ID:???
ハァ?じゃあ配列も活用してるだろうが…
ちょっと考えておかしいと思わんかな
2018/05/23(水) 16:28:17.99ID:???
Rangeの端を指す用語は何でしょうか?
isPointInRangeのようなメソッド名があるのでポイントでいいでしょうか?
2018/05/23(水) 19:23:02.55ID:???
>>627
配列は繰り返し処理だけの為に生成されていて、「値」が使われてない
n回繰り返すために配列を生成するのは無駄、単純ではない
>>612は文字列を引数にしなければならないのだから、これ以上は省略しようがない

それから、「言及してない=許容」という考え方もおかしい
一つ指摘したら、全レスをチェックして、スルーしたレスは許容するのが当然なのか?
逆にいえば、あなたは>>612以外は認めてると?
2018/05/23(水) 19:30:24.54ID:???
無駄がどうのと言ってるわりにevalはいいの?基準がよくわからんな
2018/05/23(水) 19:41:34.25ID:???
reduceでn回繰り返すために配列を生成するのは無駄、単純ではない

forでn回繰り返すために一時変数を生成するのは無駄ではない、単純

主観じゃん。forに慣れてるだけ。

たしかに無駄になるコストはforのための一時変数の方が配列より低いと思うよ。
でもそのわりにevalは認めちゃってるし…
基準がさっぱり分からない。
メモリリソースなのか、
CPUリソースなのか、
はたまたコードの見た目(単純に見える)なのか?
一番目と二番目は数字で語れるだろうけど、三番目なら主観だよ。
あなたがforに慣れてるだけ。
関数型言語の人に聞いたら違う答えが帰ってくるんじゃないかな。
2018/05/23(水) 20:11:41.21ID:???
正直ここまで不格好でない例が無い
ひょっとしたらeval例が一番なくらい
でもやろうとしていることが不格好だから仕方ないとも思う
やっぱりメソッド中で必要な処理だけforで回したり再起にするのが良いと思う
2018/05/23(水) 20:24:18.46ID:???
不格好ってことは三番目の「コードの見た目」だったようだね。主観。
2018/05/23(水) 20:58:45.37ID:???
多分それは悪い意味で言ってるんだと思うが
主観的見た目こそ超絶大切なことだと考えてる勢には通じないと思うぞ

今回の例みたいなのは動くだけなら猿でも書けるんだから
でも自由な文化のJSではどの方法が適当なのかなんて自明ではない
でもだからこそ、ロジック以外の部分で拘って研究して論争する価値があるんだと思うよ

そうして可能性を捨てずに色々試して皆で議論して良くしていこうっていうのがWebだから
2018/05/23(水) 21:38:25.82ID:???
不恰好を定義できない、不恰好でない例も出せない無能はほっとけ

しいていえば見た目は読みやすさ・理解しやすさに繋がるか?
2018/05/23(水) 21:50:06.14ID:???
自演ワロタwww
2018/05/24(木) 00:21:59.91ID:???
あたま湧いてるのか?
2018/05/24(木) 00:26:16.72ID:???
 彡⌒ミ
(´・ω・`) また髪の話する・・・?
2018/05/24(木) 00:34:23.64ID:???
>>631
>>625のダブスタも相当主観だと思ったが、どういう意味だったんだ?
2018/05/24(木) 00:44:50.20ID:???
で、どれが一番早いの?
2018/05/24(木) 00:51:08.88ID:???
>>631
reduceは配列の要素から一つの値を作るものだと考えている
要素を使わず、代入処理だけのためにreduceを使うのであれば、始めから代入処理だけの機能を使うのが理にかなっている

後な、俺が主張してるのは単純か複雑か
reduceを使うためにArray()で配列を生成し、走査可能にする為にする為にfill()で値を初期化、という理屈を初心者が理解できるとは思えん

対するeval()は善し悪しはともかく、機能理解はreduceよりも容易だと思うね
個人的にはevalを全く使わんし、eval is evil、eval <<< Function
ローカル変数破壊は御法度だし、式呼び出ししなければ安全でないのは頂けないが、それは別の問題だ
evalがコードを実行できる関数ぐらいの理解は初心者にも出来る
642623
垢版 |
2018/05/24(木) 01:01:04.14ID:???
ついでだからいうが、>>623では言及していなかった>>612を引き合いに出して、ダブスタといわれても困る(>>625)
なぜか俺が「>612が良い」と主張しているように誤解されているが、そんなことは一言もいってない
たまたま、>612が俺のいう「単純とはいえない」に該当しなかったから弁明する形になっているが、本意ではない
同様に、俺が言及しなかった他のレスも「良い」と主張しているわけではない(言及しなかったものを勝手に決めつけられても困る)
2018/05/24(木) 05:39:56.28ID:???
>>641
> reduceは配列の要素から一つの値を作るものだと考えている
それも使い方の一つだが、
オブジェクトを渡して、そのオブジェクトのメソッドを
複数回メソッドを呼び出すためにも使う
2018/05/24(木) 06:21:47.69ID:???
つまるところ、
歯ブラシは、俺の尻に突っ込むためにも使う
ということである
2018/05/24(木) 07:08:33.91ID:???
eval を使うと、納品できない

そこからシステムに侵入されるから、損害賠償請求される。
危険なことを知っていて、使っているから
2018/05/24(木) 07:11:09.43ID:???
>>643
ずいぶん、限定的な使い方だな
2018/05/24(木) 07:29:41.51ID:???
>>643
reduce使う必要ないのでは?

let i = 4;
while (i--) obj.a();
2018/05/24(木) 07:33:39.28ID:???
evalって書いたのはどう見てもネタでしょ
2018/05/24(木) 07:42:21.61ID:???
システムに侵入てお前のカツラシステムか何かか
2018/05/24(木) 07:51:46.41ID:???
>>647
それをreduceでやるのがカッコイイんですよw
素人には読めない。プロだけがわかるコード
2018/05/24(木) 08:29:12.55ID:???
それより>>647が提示したコードがいろいろヤバい
2018/05/24(木) 08:40:44.25ID:???
関数型っぽい書き方の方がイケてることに異論はありませんが
パフォーマンスではforやwhileの方が勝ります
ループ中で繰り返し呼び出されるような処理では、
やはりforやwhileで書きますよね?
2018/05/24(木) 08:46:04.44ID:???
パフォーマンスならforで書く。
ボトルネックにならないならforEachで書く。
書きやすいし読みやすいから。
2018/05/24(木) 08:51:16.54ID:???
比較して見ると、複雑な箇所が分かりやすいかもね

let i = 4;
while (i--) obj.a();

for (let i = 0; i < 4; i++) obj.a();

for (let v of [4,3,2,1]) obj.a();

[4,3,2,1].reduce(()=> obj.a());
655654
垢版 |
2018/05/24(木) 08:52:58.45ID:???
>>654は下にいく程、複雑化する
for-ofがforよりも良いという人はおそらくいない
reduceも機能の無駄遣い
2018/05/24(木) 08:54:28.60ID:???
>>647
おいおい、
obj.a();obj.a();obj.a();obj.a();

obj.a().a().a().a();
は全然ちがうんだが。
reduceの動作理解した上での批判ならまだしも、それじゃお前が理解できないものを僻みで批判してるだけじゃん。
657654
垢版 |
2018/05/24(木) 08:58:01.88ID:???
>>656
>>643に言及してるんだけど、流れが読めない人?
2018/05/24(木) 08:59:09.95ID:???
>>654
おいおい、
obj.a();obj.a();obj.a();obj.a();

obj.a().a().a().a();
は全然ちがうんだが。
お前が書いたやつは全部
obj.a();obj.a();obj.a();obj.a();
になる。
お題は
obj.a().a().a().a();
お前のだとアキュムレータ使ってないからそれこそreduceの意味まったく無い。
初心者か?
はじめてのjavascriptからやり直したら?
659654
垢版 |
2018/05/24(木) 09:00:38.95ID:???
>>658
>>657
2018/05/24(木) 09:04:01.46ID:???
obj.a();obj.a();obj.a();obj.a();
の場合はreduceの意味まったく無い。
なぜならforEachで十分だから。
初心者がお題勘違いしたのを流れだとか言って誤魔化してるだけ。
661654
垢版 |
2018/05/24(木) 09:08:43.13ID:XaJaBcs1
いや、>>643を言葉通りに受け取れば、>>647>>654も問題ないでしょ
>>625のダブスタといい、なぜ言外に定義していることがあると思いこむのかね
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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