昨今のJavaScriptをレビューしたら全くわからなかった話
はじめに
最近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ちゃんじゃなかった。。大人になってた。。