はじめに
最近JavaScriptのプルリクが来たので「よーしやったるでー」って感じでレビューしたんですが、まったく理解できずレビューになりませんでした。
その時疑問に思ったことをメモします。。
誰かの助けになれば幸いです。。
これはもう引退やな。。
classの中で function
って書くの省略してるの?
class TestClass {
test() {
処理
}
}
function
を省略して書けるのかなと思ったらそうではない。むしろ書いてはいけない。
下記はエラーになる。
class TestClass {
function test() {
処理
}
}
PHPに慣れてるからか、もやもやする。
(a, b) =>
は無名関数なのはわかったけど function(a, b)
じゃダメなの?
(a, b) =>
は無名関数で function(a, b)
と同じ。
好みの問題だがthisに違いがある。
this.hoge;
function(a, b) {
this.hoge; ←違うもの
}
this.hoge;
(a, b) => {
this.hoge; ←同じ!こっちのほうがthisが何を指してるかわかりやすい!(外と同じthisになってる)
}
...
ってなんや...
...
はスプレッド演算子。
中身バラす(展開する)やつ。
こんな感じで使う。
var parts = ['shoulders', 'knees'];
var lyrics = ['head', ...parts, 'and', 'toes'];
// ["head", "shoulders", "knees", "and", "toes"]
Arrayだったりオブジェクトだったりいろいろあるらしい。。詳しくはこちら
こんな感じで引数としても使える。無限引数。
const testFunction = (...items) => {
items.forEach(function(item) {
console.log(item);
});
}
testFunction('aaa');
testFunction('aaa', 'bbb', 'ccc');
{}
は処理書き忘れ?
{}
は空のオブジェクト宣言。
function
の処理の中身ないやつかと思ったらオブジェクトだった。なるほど、、まぁたしかに。。
reduce 関数とかで出てくる。
var countedNames = names.reduce(function (allNames, name) {
if (name in allNames) {
allNames[name]++;
}
else {
allNames[name] = 1;
}
return allNames;
}, {});
copy2clipboard = copy;
って何してるんや...
copy
はクリップボードにコピーする関数。
https://blog.leko.jp/post/copy-function-of-developer-tools/
小技として、
promiseの中とかで使おうとすると名前解決できなかったりするので、
copy2clipboard = copy;
のように、事前にクローンしておいて、
this.copy2clipboard("logloglog");
みたいな感じで使える。
Mapって何や...
new Map(kvArray);
Mapは配列を連想配列にするクラス。Mapは型。
{}
とは別。{}
はキーに数値を使えないじゃん、ちゃんとした連想配列作ろうよ!ってことでMapができた。
詳しくはこちら
await
恐怖症や...
awaitはasyncが指定されてるときに使える。処理が終わるまで待つ。
awaitがないとthis.usersValidnesにプロミスが入って、this.usersValidnes自体にthenがないのでプロミスのまま生き続ける。処理は終わるけど結果が取れない。
hensu;
hoge().then(e => {
hensu = e;
})
と
hensu;
hensu = await hoge()
は一緒。
awaitをなくすと
hensu= hoge()
となり、thenがないことになるので、
hensu.then(e=>~~~~)
してあげる必要がある。
例
hoge()は5秒くらいで"A"という文字列を返すプロミスだとする。
hensu = hoge();
await hensu; // 処理が終わるまで待つ
console.log(hensu) // 終わったプロミスが表示されるだけ
下記ならば値が取れる
hensu = hoge();
hensu2 = await hensu; 5秒かかる
console.log(hensu2) // "A"
hensu = hoge();
await hensu; // 処理が終わるまで待つ
console.log(await hensu) // ”A”
console.log(await hensu) // ”A”
console.log(await hensu) // ”A”
console.log(await hensu) // ”A”
とかはできる。
awaitは「プロミスを結果に変換する関数」だと考えるとわかりやすい!
async*
のアスタリスクは何なんや!
*
はジェネレータになる。ふつうはfuctionにつく。classだとfunction書けないのでasyncに付いたりする。
yield
(いーるど)って何やねん!
ジェネレータ用のキーワード。return
みたいなもの。
yield
は return
する。次呼ばれると yield
の下から処理が始まる。
では yield*
は一体何なのか...
yield
を返すときは yield*
としなければいけない。 return
ではダメらしい。
function* func1() {
yield 42;
}
function* func2() {
yield* func1();
}
ややこしい。。詳しくはこちら
const
って上書きできるの?
for await (const record of recordsGenerator) {
処理
}
constを上書きしてるように見えるが、そうではない。
constは上書きできないので下記は当然エラーになる。
const a = 1;
const a = 2;
が、ここでは下記のような事になるので、スコープが違うのでエラーにならない。
{
const a=1;
}
{
const a=1;
}
// constを上書きしているのではなく別モノを定義している。
さいごに
近年のJSはぼくの知ってるJSちゃんじゃなかった。。大人になってた。。