javascript 4章 式と演算子

式と演算子についてまとめていくで。演算子はキーワード演算子について書いていく。他はなんとか触れるから。

jsのインタプリタが評価して値を生成できるものを式というらしい。この時点で意味わからんねんけど、let hoge = 0みたいなのは単純な式の一つやねんて。評価されると、hogeっていう変数に0が代入される。
まぁ式はこんな感じらしくて、色々な単純な色を組み合わせることで複雑な色を構成できるねんて。
まず、最も単純な式のことを単項式といって文字列リテラルとか、数値リテラルとかリテラル系とかは単項式っていうねんて。また、「i」とかよく使うらしいねんけど、このような識別子がプログラム内に現れたら、変数か定数として認識して検索かけるねんて。この識別子も単項式。で、変数とか定数って定義が必要なんやけど、定義されてないままプログラムに書くとReferenceError飛ばしてくるらしい。

プロパティへのアクセス式、結構個人的には最初配列とかオブジェクトとかわからんかったからこのアクセス式に慣れるのすごい時間かかった気がする。それぞれアクセス式はこうなる。

オブジェクト: 式.識別子
配列: 式[式]

この式って、識別子や式にアクセスしようとしてるんやけど、どちらも最初に、前の式が評価されることに注意。注意?いらんか。
もし、評価値がnullやundefinedになった場合は、TypeErrorがなげられるらしい。ここで、条件付きプロパティアクセスっていうのが紹介されてた。
書き方は簡単で、

オブジェクト: 式?.識別子
配列: 式?.[式]

前に「?.」を付けるだけです。これを付けると、前の式を評価したときにnullやundefinedになってもtypeErrorを防ぐことができるねんて。この条件付きプロパティアクセス式は長く連結(チェイン)できるからオプショナルチェイニングって言われたりもするらしい。ええねん、もう色んな名前出してくんなよ。チェインとか混乱するって。
ちなみにこの式はES2020で出てきた機能やねんて。

呼び出し式にも条件付き呼び出しっていうのがあるんやけどまず、通常のやつからいく。

f(0)
Math.max(x,y,z)
a.sort()

上の例が基本的な呼び出し式で何を呼び出してんねんっていう話やと思うねんけど、関数とメソッドらしい。正直関数とメソッドの違いわかってへんから、今調べてんけど、どっちもfunctionをつかって記述されるらしいねんけど、オブジェクト型データに実装した関数を特別にメソッドって言うてるだけらしいわ。くそが!
呼び出しの流れは、まず関数式が評価されて次に引数式が評価される。もし、関数式ではない場合にはTypeErrorが投げられる。
関数にはreturnってよく使われるんやけど、returnを使うことで値を返すことができるやって。reutrn書いてないとundefinedになる。
でまたまた条件付き式やねんけど、

hoge?.(x)

って言う感じで書く。一緒やからよかったけど違ったらマジギレしてるわ。
あとはオブジェクト生成式やねんけどコンストラクタ関数とかまだわからん話があるから、一旦ここまで。
関係演算子の中にinstanceofっていう聞いたことない演算子があったからそれについてメモ程度に書いておく。
instanceof演算子は何かって言うと、まず構文は「オブジェクト instanceof クラス」で書くらしいねんけど、このクラスの中にオブジェクトはインスタンスとして含まれてるんか調べるものらしいねんな。ようわから。いつつかうねんな。で、これはプロトタイプチェーンについて理解しとかなあかんねんけど、一旦書いてた通りに説明すると、instanceofを評価する時にクラス.prototypeを評価して、オブジェクトののプロトタイプチェーンにクラス.prototypeが存在するかどうかを検索するんやって、でそれが存在すればtrueを返してなければfalseを返す感じらしい。
ちなみに左辺のオペランドがオブジェクトでない場合はTypeErrorなげてくるねんて。

評価式について書いていく。

mdn

evalについてしらべたらいきなり怖いこと書かれてた。使わんとこって胸に誓ってんけど、そもそもこれってなんなんかっていうと、文字列で書かれたjsコードを評価するものなんやってたとえばeval('2+2')ってやると4が出力されたりする。まぁでもセキュリティー的に悪くなるなら使わんし、webサーバーの中にはContent-Security-PolicyっていうHTTpヘッダーをつかってeval()を無効化させてるから使われへん場合もあるねんて。でstrictモードを使うともともとは予約語じゃなかったらしいねんけど、strictモード内で事実上予約語にすることでevalを変数名とかで使えへんようにしてたりしてる。
ちねみにeval()って関数じゃね?って思ってんけど関数でした。でも本来は演算子のような扱い方をするべきなので、式と演算子の章に筆者は書いたらしい。しらんけど。

その他の演算子
ファーストディファインド演算子(??)はてな二つを使う演算子で例えばこのように書くらしい

let max = maxWidth ?? preferences.maxWidth ?? 500

で何かって言うと、maxWidthから評価していってこれが定義されてなかったらつまりnullやundefinedのときは無視してつぎのpreferences.maxWidthを評価して定義されてなかったら500を使うみたいにやる演算子やねんて。具体的にどんな時に使えばいいのかは知らん。
await演算子
awaitは非同期プログラミングを簡単に記述できるようにES2017に導入されたやつで詳しくは13章読まなあかんかったけど演算子なんやーって思った。
void演算子
これはあんまり使われへんらしいねんけど、単項演算子でオペランドを評価した後廃棄してundefinedを返すらしくて、いつ使うかというとオペランドが副作用を持つ時にvoidつかうねんて。いやわからん副作用ってなに。

mdn

なるほど。わからん。APIとかまださわったことないから読み進めていったらわかってくるんかな。とりあえずundefined値を得たい時に使えそうっていう。

mdn

なるほど!即実行関数式っていうのも初めて知ったけどこういうときにエラー投げるのを防ぐっていう役割もあるんか!

ほんまや。すげぇ。即実行関数式は結構使いそうな気がするから覚えてて損ないな。

と言ったように単純な式と演算子を組み合わせて色んなプログラムが構築できそうと思えた章だった。voidとかキモいの出てきたわって思ったけど理解すると可愛いもんやなって思えたし、もっと無駄を無くしたシンプルなコードにできそうな気がしてきた。

この記事が気に入ったらサポートをしてみませんか?