+ JavaScript の質問用スレッド vol.137 +
■ このスレッドは過去ログ倉庫に格納されています
JavaScript を自ら学ぶ人のための質問スレッドです。
次スレは>>950が(本スレで改善案があれば考慮して)立ててください
■規則/推奨ルール
・メール欄を空欄にし、名前にレス番を入れることを強く推奨(なりすまし防止)
・質問内容は具体的に。言葉だけでなく、出来る限り再現性を確認したサンプルコードの掲示。
・質問テンプレートの利用推奨。
・質問への「答え」から解離した議論はよそでやること。
■禁止行為
・丸投げ質問
・迷惑スクリプトの質問
・オレオレ用語の使用(一般的な用語を使用する事)
・煽り、批判等の他人を不快にさせる行為(批判の代わりに「AよりBが良い」のような代案を出す事)
■質問テンプレート
【環境】OS, ブラウザをバージョンと共に記入してください。
【条件】期待する回答の条件を書いてください。
【何をしたのか】何をしたら問題の現象が発生するのか。再現手順を具体的に書いてください。
【エラーメッセージ】エラーメッセージがあれば正確に書き写してください。
【期待する結果】最終的にどういう結果を望んでいるのか、を書いてください。
【サンプルコード】現象を再現可能な最小限のコードを書いてください。
1レスに収まらないならコード投稿サイトを利用してください。
http://jsdo.it/ http://jsbin.com/ http://jsfiddle.net/ http://ideone.com/
※前スレ
+ JavaScript の質問用スレッド vol.136 +
http://mevius.5ch.net/test/read.cgi/hp/1542707959/ >>95
マジレスすると、Mapリテラルは非常に設計が面倒くさいと思うぞ
keyに何でも入れられるので、Syntaxが複雑化極まる
{{1:1,true:2,"s":3,{}:4,[]:5,()=>1:6,function f(){}:7,Symbol():8,new Object:9}} Mapいいんだけどさぁ、重厚長大過ぎるよ。
使いどころはあるけど普段使いしないよ。
単なる組み込みクラスでリテラルも無くsetget系APIも目にうるさい。
顧客が本当に求めていたもの: 列挙時順序保証のオーダードオブジェクトリテラル
const list = #{variable1, variable2, variable3};
で>>81の順序が保証されるみたいな。
これをfor inしたときはプロトタイプ辿らないみたいな挙動なら完璧。 たしかにget/setはダサい
[]でアクセスできてこそmap
TypedArrayが[]アクセスできるのは何でだっけ >>106
後方互換性を考慮してあの設計なのだろう >>107
TypedArrayは通常の配列と同じでString,Symbol型しかプロパティに持てないから
原理的には、プロパティアクセサを拡張すれば、new Mapでも[]の参照が可能 テンプレートリテラル`〜`に対するタグ付きテンプレートリテラルhoge`〜`みたいに配列リテラル[〜]、オブジェクトリテラル{〜}に対してもfuga[〜]、piyo{〜}みたいにユーザー定義の道を開いてくれると嬉しい。
配列リテラルについては無理か…
fugaに対するキーワードアクセスと区別つかないもんな。 >>112
滅茶苦茶読みにくいな
template(`${0} ${'foo'}!`)がtemplate`${0} ${'foo'}!`と書けるだけだが、何が便利なんだ? >>113
styledComponentのAPIがこれ使ってた気がするな…
まあリフレクションAPIとかと同じでフレームワークやライブラリを作る人が使う機能で一般ユーザーは提供されるAPIにしたがってhoge`〜`するだけだよ。 >>114
なるほど、タグ付きテンプレートリテラルに最適化されたAPIを作れるのが利点か >>113
そんなもんテンプレートエンジン使っていればわかるやん?
例えばCakePHPだとh関数でHTMLエスケープするやろ?
e関数だと、そのままechoやろ? tag(``)がtag``って書けるのがナウいんだよ!うるせーな!! >>118
違います。
tag(`a${1}b`)だと関数tagは1つの文字列a1bしか受け取れません。
tag`a${1}b`だと関数tagは配列(厳密にはrawも含むが)['a', 'b']と1がそのまま受け取れます。 眺めてたらってそういう話もなくはないんだなって。。。
もういい加減にしてくれ
この手の話は何度もES6から出てただろうが
そして何度も挙がるものって2種類あって
毎回進歩するものとそうでないもの
これは後者だろうが
そのへんなんにも追っかけてなくてニュアンス理解してないくせに
一瞬調べて無責任に引っ張ってくるってどうよお前
お前どうよ?それ 無責任って何を当たり前なことを…
なんで俺が責任とるんだよバーカw >>77
let variable1 = "";
let variable2 = [];
let variable3 = 12;
let list = [];
list.push({variable1});
list.push({variable2});
list.push({variable3});
for (let obj of list) {
alert(Object.keys(obj)[0]);
} 名前はスコープで管理されているのでwithを使うしかない
それでも原理的に確実ではないのでwith-proxyを使うか リストに追加した後も変数名残そうと思ったらwith-proxyだけじゃ足りないだろ
value-proxyが導入されたら組み合わせて可能かもしれないが with-proxyて何?検索しても出てこない(´;ω;`)
なんでみんな知ってるんや… そのまんま
with(new Proxy(......)){}
のことでしょ
こうしたら変数アクセスをほぼほぼプロキシできる
例えば__scope__でスコープオブジェクトにアクセスできるようにしたり
$GetVariableName(a) // 'a'
みたいな事とかいろいろできる 他にも分数だったりbignum同士の四則演算もできたはず
$BEGIN_BIGNUM
a = '12345678901234567890'
b = '23456789012345678901'
c = a + b
$END_BIGNUM
c // '35802467913580246791'
って感じでできるようにプロダクトで使ったことある へぇ〜
参考ページない?英語でも可
いろいろサンプル見たい 原理的に変数アクセスがプロキシできたらできることなら何でもできるよ 変数名を後から変更すると不具合誘発するとか、怖くて使えない 変数名を変えても影響でないでしょ
メタ処理で決め打たなければいいだけなんだから 論よりコード。
with proxyでゴチャゴチャ言ってる人たちは上の奴らと違ってコードを出さずにイキってばかり。 すまんが俺はコードより論派なんでね
糞面倒な糞コードをわざわざ書こうとは思わん
特に楽しくアイディアを語り合ってるのをイキってるとか言うやつの言うことは聞きたくないね
素直なかわい子ちゃんのお願いだったら聞いてやる てかwithproxyとやらでも順序は保証できないじゃんw
順序保証しなくていいなら>>81でいいじゃんww
ダラダラproxy書く意味まるでナシwww
proxyproxy言ってる人は何か勘違いしているのでは?wwww
論は論でも机上の空論wwwww こいつ何いってんだ?
listに入れたものだとvalue-proxy使わないと難しいねって最初から話されてるだろ
勿論すべての箇所で値が欲しいときはSLOVE(x)、名前が欲しいときはNAME(x)を使う
つまり
for(let i = 0; i < SLOVE(list).length; i++)
{
alert(NAME(SLOVE(list)[i])); //variable1 variable2 variable3と順番に表示
}
みたいに書いてもいいっていうなら原理的に可能だが あと、ただ変数を列挙したいだけなら上で挙がったように
__scope__みたいなの1つだけ特別扱いして
__scope__.keys()みたいなのを定義すればいいだけだと思うよ
そのままだとすべて列挙することになるけど
まあどうして列挙したいのかわからんが、例えばデバッグのためなら
変数名のパターンで絞り込むとか、そのくらいのことで実際はOKかもしれんよ お願いします
x = {"hello" : "world"};
は
x.["hello"] と x.hello で値が取得できますが
y = {"my name" : "John"};
のようにキーに空白が入った場合
y["my name"] としか書くことはできないのでしょうか >>77
趣向を変えてタグ付きテンプレートでやってみたよ!
let list_keys = strs => [eval(strs[0]), strs[0].replace(/\[(.*)\]/, '$1').split(/ *, */)];
let variable1 = '';
let variable2 = [];
let variable3 = 12;
let [list, keys] = list_keys`[variable1, variable2, variable3]`;
for (let i = 0; i < list.length; i++) {
alert(keys[i]);
} $.ajaxのget使うときにurlのパラメータを指定しますが
{"url":'ht略://sample.com/api.php',
"type":"GET",
data:{"hoge":2,"fuga":3}
}
とした場合403が返ってきます。でも、
{"url":'ht略://sample.com/api.php?hoge=2&fuga=3',"type":"GET"}
みたいに"url"に書いてやると問題なくなります
考えられる原因はなんでしょうか >>151
記述を間違えている
開発ツールのnetworkタブで見てみると良いかも DOM操作ライブラリ回帰の流れでjQueryのajaxはもうslimビルドから削除されたよ。
AxiosかSuperAgentかRequest使いなよ。 $.ajax使わないで、$.get使えばいいのにっていつも思うんだが
なんでわざわざ冗長なのを使うんだ? >>154
ajax()ならgetでもpostでも容易に切り替える事ができるって理由で使っていたな
要は実装が決まってない状態
この状態を悪いって言わないでくれよ、この状態になってるから仕方ないんだ getは取得でpostは送信だろ?
なんでどちらかが決まらないなんてことがあるんだ?
今はデータ取得してるけど
もしかしたらデータ送信するかもしれない
とかか?なんでそんなのがあるんだ? 仮に会ったとしても、$.getを$.postに変えれば同じだろう postでも取得できるしgetでも送信できるけどね >>157
データを取得するけど指定したパラメタに応じた副作用があるAPIはどっちにしたらいいんだ? >157
getは取得→いやそもそもその取得するためのデータを送信してるだろ
postは送信→いやその後取得するだろ
検索結果、登録情報の更新、など、決めないと難しいと思う 1970年1月1日9時00分からの任意の経過秒数から
年月日と曜日を求めるにはどうすればいいんですか?
例えば 6300000000 secだったら西暦何年の何月何日何曜日かというようにです 9時間分のミリ秒数足してnew Date(経過時間)じゃダメ? Date
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date
1970年01月01日 00:00:00 UTC (Unix エポック) からのミリ秒数を表す整数値です
(ただし、多くの UNIX タイムスタンプ関数は、秒単位でカウントすることを考慮してください)。
なお、閏秒を無視します
その、+9時間は、エポックを日本時間で表示しただけ。
内部的には、UTC で管理していて、表示する際、ローカルタイムに変換しているだけ >>162
> getは取得→いやそもそもその取得するためのデータを送信してるだろ
> postは送信→いやその後取得するだろ
それは屁理屈 // 1970年01月01日 00:00:00 UTC (Unix エポック)
var dt = new Date( 1970, 0, 1, 0, 0, 0 );
console.log ( dt );
// 1日後
dt.setSeconds( dt.getSeconds() + 86400 );
console.log ( dt );
日付を扱うなら、moment.js が便利らしい date-fns、DayJS、Luxonもあるでよ var timestamp = 6300000000
var date = new Date (timestamp * 1000)
console.log(date)
document.write(date) 下記で、本日の日付を表示できますが、
本日の一週間後 を表示させるには、どこを+7したら宜しいでしょうか
よろしくお願い致します。
<SCRIPT type="text/javascript">
<!--
function _HpbDays()
{
this[0] = "日"; this[1] = "月"; this[2] = "火"; this[3] = "水";
this[4] = "木"; this[5] = "金"; this[6] = "土";
}
var now = new Date();
var yr = now.getYear();
var mn = now.getMonth() + 1;
var dt = now.getDate();
var dy = now.getDay();
var fyr = (yr < 1900) ? 1900 + yr : yr;
var dys = new _HpbDays();
var dyj = dys[dy];
document.write(fyr + "年" + mn + "月" + dt + "日");
//-->
</SCRIPT> >>170
const nextWeek = new Date();
nextWeek.setDate(nextWeek.getDate() + 7); >>170
勝手に関数などを作るな!
全部やり直せ!
このページを参照
Date
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date
var dt = new Date( ); // 今日
console.log ( dt );
dt.setDate( dt.getDate( ) + 7 ); // 1週間後
console.log ( dt );
日付を扱うなら、moment.js が便利らしい momentはオワコン。
date-fns、DayJS、Luxonを使え。 170です
165さん172さん、ありがとうございます。
しかしよく解りません。そのコードを、どこに挿入すればよいのでしょうか・・・ ∧__∧
(´∀` )
(⊃⌒*⌒⊂)
/__ノωヽ__) このサイトを参照!
Date
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date
>>170
を全部削除して、これだけでよい
var dt = new Date( ); // 今日
console.log ( dt );
dt.setDate( dt.getDate( ) + 7 ); // 1週間後
console.log ( dt );
var str = `${ dt.getFullYear( ) }年${ dt.getMonth( ) + 1 }月${ dt.getDate( ) }日`;
console.log ( str ); キモイんでカッコの中にスペース入れるのやめてください 関数呼び出しの後にスペース入れるのもやめてください テンプレート文字列使ってるのにvar使うのやめてください ブラウザのコンソールで書いては消して試すのに便利だよvar ブラウザのコンソールでいちいちvarなんて書いてんの?
使い捨てるのになんでそんな面倒なことしてんの? オレ関数スコープがピッタリなところはvar使ってるわ。ブロックスコープ欲しいときは基本const、どうしてもミューテートしたい時やっとlet。letが一番使わない。 let, constのTDZの仕様が気に入らな過ぎて関数スコープ作ってvar使ってるわ。 効率的でもない、可読性や保守性が高いわけでもない、何のメリットもないこだわり なんか打つのめんどくてlet使うことが多い……
あとでconstに置換
あほか俺 もしbabelでes5に変換してるんだったら関数スコープできてるとこはvarのままのほうがいいんじゃないかな。
変換後のコード量が意味もなく増える。 >>178
☓ `${ dt.getFullYear( ) }年${ dt.getMonth( ) + 1 }月${ dt.getDate( ) }日`
○ dt.toLocaleDateString('ja',{year:'numeric',month:'long',day:'numeric'}) >>191
babelはconstもletもvarに変換されるんだが? >>193
本人ではないが、>191の2行を読むべし >>194
えとさぁ、変換後のコードは増えないって意味なのわからない? そもそもvarもletもよっぽど使わないでしょ
変数なんてなるべく変更しないものであるべきで、それならconst使うわけだし
変更しない変数にlet?
後から他人が読むこと考えろとしか >変数なんてなるべく変更しないものであるべき
そうなのか???
初めて聞いたぞ ■ このスレッドは過去ログ倉庫に格納されています