2020/08/14

[js] typescript (2)

では、2回目はJavaScriptについてだ。
TypeScriptというタイトルなのに・・・なのだけど、TypeScript全開で書いたコードはNode.jsでは動かせないけれども、JavaScript全開で書いたものはTypeScriptでも有効なのだから、まずはJavaScriptのところを見ておかねばなるまい。

といっても、JavaScriptを全部やるわけではなく、TypeScriptとの比較という意味でそういう章立てになってるのだろう。


JavaScript

JavaScript - TypeScript Deep Dive 日本語版
https://typescript-jp.gitbook.io/deep-dive/recap

等価演算子の同一

null/undefinedチェック以外は===使っておけ、ということか。
自動型変換は気付きにくいのでやっかいだな。

 

Object型については、===で比較できるのは同一のアドレスを指しているかどうかだけのようだ。
むかしC言語の話で「C言語には値渡ししかない」と説明されて、ポインタもアドレス値を渡しているだけだから値渡ししかないのだ、と納得したのだが、そんな感じだな(なにがだ)。

 

nullとundefined

nullとundefinedについては、基本的に==でnullをチェックすれば良い。
==nullだと==undefinedもチェックできるからだ。
ただし、その変数がそもそも定義されていないという場合には、nullだろうとundefinedだろうと比較したら例外が発生するので、もしそんなことをしたいならtypeofを使う。

むしろ、じゃあどこでundefinedを気にする使い方をするのかというと、構造体とか戻り値とかだそうだ。
戻り値でundefinedを使うくらいなら、golangのようにerrを使うのがよいのか。型アノテーションというのがそういうやつなのかな。

 

JSONのシリアライズは、JSON仕様にnullはあるけどundefinedはないので、nullだったらメンバになるけどundefinedは除外されるらしい。ほほぅ。

まとめとして、TypeScriptのコーディングガイドラインとしてはnullを使わずundefinedだけにするのが推奨らしい。
まあ、変数定義後のデフォルト値がundefinedだから、わざわざnullを突っ込む必要はなかろうということか。
ともかく、==nullでチェックしてる分にはいいんじゃないの、ということだった。

 

クロージャ

聞くね、クロージャという言葉。いくつかの言語で出てきたと思う。

クロージャ - JavaScript | MDN
https://developer.mozilla.org/ja/docs/Web/JavaScript/Closures

「クロージャは、関数と、その関数が宣言されたレキシカル環境の組み合わせです」。既に意味が分からん。

うーん・・・C++のtemplateみたいな使い方ができる?というほどtemplateにも詳しくないのだが、可変にできそうなところを可変のままにして関数の枠を作っておき、そこに値を与えて新たな関数として使えるようにしてしまう、という感じなんじゃなかろうか。新たな関数にするのも1段だけじゃなく、その新しい関数にパラメータを与えてさらに新しい関数を作る、みたいなこともできるようだ。

まあ・・・使い道が思いつくまでは放置だな。

 

 

Number型

この前かった「開眼!JavaScript」にも書いてあったが、JavaScriptにはネイティブなオブジェクトもあるし、プリミティブ型ももちろんあるのだった。
数値に関してはNumberしかない。

で、Numberっていったいどういうものかと思っていたのだが、倍精度の64bitらしい。double相当か。
最近の言語だからか、2進数による誤差や64bitを超える値を扱うことが考慮されているようで、big.jsというものがあるそうだ。golangのbigみたいなもんか。C言語にはなかったのだけど、最近の動向は調べてないなぁ。

あとは、NaN、無限大、無限小の定義があるらしい。
NaNは、他の言語だとエラーだったり例外だったりするやつか。例では√-1が挙げられていた。
無限大と無限小は、この範囲を超えたら無限になるという閾値ね。外れるとInfinity(あるいは-Infinity)になる。

 

Truthy

「Trueと評価される値」だそうな。反対語はfalsyね。
ちょっとC言語っぽく、0以外がtruthyだ。空文字列でなければtruthyだし、nullやundefinedでなければtruthy。

でもやっぱりbooleanっぽいのがいいよねー、という場合は、これもCっぽく!!が使えるそうだ。
まあ、!が使えるなら!!も使えるわな。
個人的には!を使う時点でtruthyを認めてるんだから!!しなくていいんじゃないの、とも思うのだけど、全体的にそうコーディングしておくと静的解析ツールなんかで間違いを検出しやすいんじゃなかろうか。最初booleanだったものがnumberに変更になったのを忘れてたとか。


モダンなJavaScriptの機能

モダンなJavaScriptの機能 - TypeScript Deep Dive 日本語版
https://typescript-jp.gitbook.io/deep-dive/future-javascript

 

classes

確かに本で出てこなかったな、class。
JavaScriptのObjectでも同じようなことはできた・・・というか、できないとTypeScriptでも実現できないんだった。

 

アロー関数

アロー関数はthisの束縛だっけ、あれがコールバックと違うということだったと思うのだが、今やサポートしていないのはIEだけらしいから全環境で使えるという扱いでいいのかな。

あまり理解はできていないのだが、実際にアロー関数じゃないとダメだった場合に遭遇してしまったので、嫌でも覚えないといかんだろうという気がしている。

 

let, const

varじゃなくてlet使っておけばいいと思う。
constも使える。
ブロックスコープじゃないのがあるというのは思ってもなかった。

 

分割代入, スプレッド演算子

困るのがこういうやつなのよ。。。
こういう記法があるんだろうということはコードを読んでいてわかるのだけど、キーワードが分からなくて検索できないのだ。

「スプレッド演算子」といっても、そういう演算子があるわけでもなさそうだし。
検索すると「スプレッド構文」が出てくるのだが、ここではSpread Operatorになっているから誤訳ではなさそうだ。

 

for...of

golangだとrange戻り値の1番目がindex、2番目が要素だったっけ。
for...inがindexを返すやつで、for...ofが要素を返すやつ、ということか。

最近、forでぐるぐる回すのを書いた気がするが、for...ofを知っていればすっきりしただろうに。というか、知ってる人がコード見たら「この人for...of知らんのか」って思うんだろうな。

 

テンプレートリテラル

知ってしまえば「文字列をシングルやダブルで囲む代わりにバッククォートで囲むやつ」なのだけど、あの書き方とこの名前は結びつかないな。今も出てこない。

まあ、便利になるだけで、今の書き方でもなんとかなるから、思い出せたら使うくらいでいいだろう。

 

Promise

わしの若い頃はPromiseがなくてのぅ、と言いたくなったが、単に知らんかっただけだろう。
最近はPromiseを使うところではasync-awaitで事足りることが多かったのだが、あれはあれでPromiseの違う運用みたいなものだったと思う。

ともかく、ここの例になっている非同期とtry-catchのところを読んだだけでも、自分で正しく実装できる自信がない。

 

ジェネレータ

これもコードを見ても名前が思いつかないパターンだ。幸い「function*」が検索できるのでセーフだが。

イテレータの作成をするもので、関数ポインタではない。


 

疲れた・・・。

TypeScriptだったら、みたいなのがほとんど出てこなかった。
3回だけブログにするつもりだったので、あと1回なのだが、はてさて何をやるべきかね。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。