JavaScriptの不思議なやつ

<img width="1280" alt="Advent Calnder.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16065/c225855a-59e9-092a-9edb-63662f3480aa.png">
はいよ〜。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">感情起伏ほぼ無し<a href="https://t.co/M36m7Orvbf">https://t.co/M36m7Orvbf</a></p>&mdash; 駆け出し亭めろたん、 (@renyamizuno_) <a href="https://twitter.com/renyamizuno_/status/1207921276699889665?ref_src=twsrc%5Etfw">December 20, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

感情の起伏が無でした。

これは [bosyu Advent Calendar 2019](https://qiita.com/advent-calendar/2019/bosyu) の 20日目の記事ですわい。

よろしくね。

JavaScriptってたのしいよね！
ということで、なんでそうなるの？そういうことできるの？っていうJavaScriptの挙動を書いていくぞ！

知っている人も多いと思うけどかいていく〜

## Undefined

`Undefined`みんな知ってるよね！
定義されてないとでるやつね。

JSでは `undefined` がプリミティブな値として存在しています。
[プリミティブ](https://developer.mozilla.org/ja/docs/Glossary/Primitive)

数値とかと同じなのですが、なんかおかしい？ところがあります。

```js
5 = 2; // => Uncaught SyntaxError: Invalid left-hand side in assignment
null = ''; // => Uncaught SyntaxError: Invalid left-hand side in assignment
undefined = 2; // => 2
```

普通なら値に代入するとエラーになりますが、`undefined`はそうなりません。

~~_OK，Baby，ハニー、それは、WHY，な ぜ か？_~~

`undefined` は値ではなくグローバル変数のため、代入ができてしまうのです。
ウケるよね。
`undefined`に違う値を代入しても変わらないのでまあいいんですが、過去のJSはこれが書き換えられるというアレでした。
シビレルね。

`const` だとエラーが起きるはずなので、まじでこれが普通に通るのがよくわかっていないし値がかわらないのよくわかっていない。

```js
const hoge = '';
hoge = 'a'; // => Uncaught TypeError: Assignment to constant variable.

undefined = 2; // => 2
undefined; // => undefined
```

## 数値

こやつは単純にそうなるんかお前。みたいなのがあるところを書いてくぞい。

```js
1.toString(); // => Uncaught SyntaxError: Invalid or unexpected token
```

まあこれは落ちそうよね〜。
では次の書き方にするとどうでしょうか。

```js
(1).toString(); // => "1"
```

カッコで括ってやればなんか`toString`を実行できます。
これは`Number`という数値のラッパーオブジェクトがあるためいい感じに実行できる感じですね。
[Number](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Number)

では次のはどうでしょう。

```js
1..toString(); // => "1"
```

**??????????????**

たのしいですね。

JSの数値リテラルは、整数部と小数部と指数部で表現するようになっています。
`.`がはいると小数部だ！という感じになるようです。その`.`のあとには数値が必要ではないので`1.`で`1`という数値を表現できます。
そのあとはメソッドを呼び出すことができるようになるため、これでいい感じに実行できるわけですね〜〜。
~~_そうはならんやろ_~~

まあそれはそれで、次のをみてください。

```js
.1.toString(); // => "0.1"
```


:thinking: :thinking: :thinking: :thinking: :thinking: :thinking: :thinking: :thinking: :thinking: :thinking: :thinking: 

思考が停止しますね :innocent: 

## 比較演算子

まあこれは有名っすね〜〜〜。

`==` とかを使うとアレだよ〜〜ってやつです。

```js
null <= ''; // => true
null >= ''; // => true
null == ''; // => false

undefined <= ''; // => false
undefined <= ''; // => false
undefined == ''; // => false

undefined == null; // => true
```

ゲラゲラ

## ?とかを使う

JSでは名前に`?`を使えない(はず)のですが、PKキアイΩを使えばつかえます。

```js
const obj = {};

obj.? = '???'; // => Uncaught SyntaxError: Unexpected token '?'

obj['?'] = '???'; // => '???'
obj['?']; // => '???'
```

こうやれば使えます。
お好きな記号等をお使いください。
便利かどうかは不明です :innocent: 


## テンプレートリテラル

テンプレートリテラルは文字列のなかに変数を展開できるアイツですね。

```js
const hoge = 'hi';
`みてる〜〜〜〜${hoge}????`; // => 'みてる〜〜〜〜hi????'
```

これっすよ。
これなんですが、ちょっとおもしろいことにつかえます。

```js
const hoge = 'hi';
console.log`みてる〜〜〜〜〜${hoge}????`; // => ["みてる〜〜〜〜〜", "????", raw: Array(2)], "hi"
```

`Function` に `()` をつけずテンプレートリテラルをガッチャンコすると、なぜか実行できます :innocent: 
そういう機能なんですがね。

どうなっているかというと、
第一引数にテンプレートリテラル内の文字列が配列で入ってきます。
式が組み込まれている場合(`${}`これね)、そこで切って文字列の配列とします。
それで第二引数以降に、その式がジャカジャカ入ってきます。

これをうまく使っているのが`styled-components`ですね。
[styled-components](https://www.styled-components.com/)

```js
const Button = styled.a`
  background: transparent;
  color: white;  border: 2px solid white;
  ${props => props.primary && css`
    background: white;
    color: palevioletred;
  `}
`
```

こういうの。

いい感じに使えるとかっこいいですね！

ほかにも

```js
['a', 'b'].join` `; // => 'a b'
```
みたいな感じに使ったりできます :innocent: 
コードゴルフに使えるぞ！とかなんとか。


## まとめ

なんなん？？？とかえ？？？？？っていうのを書いてみました。
まあ謎ですね。

うまく使えそうだ！とか絶対に使わねえぞ！！っていうのがいくつかあったかと思います！
うまくやっていきましょう！(雑

まあ多分他にもたくさん色々あるかもですね！
そういうことで僕は探求の旅に出ます！