【初心者】React&Redux入門を理解するための超入門/jsの基礎編

文系大学1回生です。
半月ほどReactとReduxの勉強をしています。
理解がなかなか難しいので、勉強したこと、自分なりのポイントをアウトプットしていきます。

ReactやReduxのコードの意味が分からないのは、jsの基礎が抜けているのも一つの原因でした。
そこで、jsの基礎をもう一度確認しました。

#jsの基礎

###``document.getElementById("hoge")``

```html
<!DOCTYPE html>
<html>
<body>

<h2>JavaScript in Body</h2>

<p id="demo"></p>

<script>
document.getElementById("demo").innerHTML = "My First JavaScript";
</script>

</body>
</html> 

```

Reactにも出てきます。
任意のHTMLタグで指定したIDにマッチするドキュメント要素を取得するメソッドです。

###``オブジェクト``

```js
<script>
// Create an object:
var car = {type:"Fiat", model:"500", color:"white"};

// Display some data from the object:
document.getElementById("demo").innerHTML = "The car type is " + car.type;
</script>
```

Reactでは、複数のスタイルを設定するために、スタイル名をプロパティとしたオブジェクトのリテラルを記述するときや、ステートの値を設定するときなどに必要な知識です。

＊[new演算子の使い方と生成方法まとめ！](https://www.sejuku.net/blog/24383)
これもオブジェクトの勉強になった。

###``アロー関数``

普通の関数。

```js
hello = function() {
  return "Hello World!";
}
```
アロー関数。

```js
hello = () => {
  return "Hello World!";
}
```
リターン省略。


```js
hello = () => "Hello World!";
```
引数あり。

```js
hello = (val) => "Hello " + val;
```
()省略。

```js
hello = val => "Hello " + val;
```

###``コールバック関数``

```js
function doTwice(func) {
  func(); // 1回目！
  func(); // 2回目！
}

// あいさつするだけの関数
function hello() {
  console.log('Hello!');
}

// あいさつを2回実行する
doTwice(hello); //Hello!
                //Hello!
```

hello:コールバック関数　渡すときは()をはずす。
doTwice:高階関数(関数を受け取る関数) 

###``map``

構文

```js
var array = [ 配列データ ];
 
array.map( コールバック関数 );
```

基本的な使い方

```js
var items = [1,2,3,4,5];
 
var result = items.map(function( value ) {
 
    //配列の各要素を2倍にする
    return value * 2;
 
});
 
console.log( result ); //[2, 4, 6, 8, 10]
```
mapとアロー関数

```js

var result = items.map(( value ) => {
 
    //配列の各要素を2倍にする
    return value * 2;
 
});
```

###``Spread Operator``

配列

```js

const hoge = [2, 3];
console.log([1, ...hoge, 4, 5]) //[1, 2, 3, 4, 5]
```

オブジェクト

```js

const fuga = {name: 'Taro' , age: 25 };
const piyo = {name: 'Jiro' , location : 'Tokyo'};
console.log({...fuga, ...piyo}); //{ name: 'Jiro', age: 25, location: 'Tokyo'}
```

###``slice``

```js

var array = ['メロン', 'リンゴ', 'イチゴ', 'バナナ'];
 
//開始位置を指定
var result1 = array.slice( 1 );
 
//開始位置と終了位置を指定
var result2 = array.slice( 1, 3 );

//そのまま返す
var result3 = array.slice( );
 
console.log( result1 ); //["リンゴ", "イチゴ", "バナナ"]
console.log( result2 ); //["リンゴ", "イチゴ"]
console.log( result3 ); //["メロン", "リンゴ", "イチゴ", "バナナ"]
```

そのまま返すなんて意味がないと思うかもしれない。
しかし、Reduxで配列操作をする時に必要なのだ！

###``concat``

```js
var array1 = ['ho', 'ge'];
var array2 = ['wa', 'fu'];
var result = array1.concat(array2);
 
console.log(result);// ho,ge,wa,fu
```

配列を結合できる。
とにかくReduxでは配列を直接いじりたくない。

###``三項演算子の省略``

構文

```
真偽値 ? trueの時に実行する文 : falseの時に実行する文
```

trueの例

```js

let hoge = "true"
console.log (hoge ? "hogeやで" : "hogeじゃないで"); //hogeやで
```

falseの例

```js

let hoge = "false"
console.log (hoge ? "hogeやで" : "hogeじゃないで"); //hogeじゃないで
```


###``イベント``

```js
<button onclick="document.getElementById('demo').innerHTML = Date()">The time is?</button>
```

上記は``onclickイベント``。クリック時に発動。
他に、``onchange`` ``onmouseover`` ``onkeydown``などがある。

###``this``

```js
var myObject = {
  value: 10,
  show: function() {
    console.log(this.value);
  }
}
myObject.show(); // 10
```
上記は、単にメソッドの呼び出しを行っています。
しかし、``this``はそんなに生易しいものでは無いようです。

＊[thisって何？使い方を覚えて、JavaScriptをもっと楽しく使おう！](thisって何？使い方を覚えて、JavaScriptをもっと楽しく使おう！)

＊[windowオブジェクトとグローバルの実態について](https://wp-p.info/tpl_rep.php?cat=js-application&fl=r9)

＊[strictモードの使い方を徹底解説！](https://www.sejuku.net/blog/58342)

＊[applyって何だ？callとの違いまで徹底解説](https://www.sejuku.net/blog/64089)

＊[JavaScriptの「this」は「4種類」？？](https://qiita.com/takeharu/items/9935ce476a17d6258e27)

これらの記事を理解して少し``this``について詳しくなったと思います。
windowオブジェクトとグローバルの実態なんて知らなかった。。。

###``super``

```js

class Animal {
  constructor(name) {
    console.log('親クラスのコンストラクタ');
    this.name = name;
  }
  
  speak() {
    console.log('親クラスのspeakメソッド');
  }
}

class Dog extends Animal {
  constructor(name, age) {
    console.log('子クラスのコンストラクタ');
    super(name);
    this.age = age;
  }
  
  speak() {
    super.speak();
    console.log('子クラスのspeakメソッド');
  }
}
const dog = new Dog('ポチ', 1);
dog.speak();
console.log('名前: ' + dog.name + '年齢: ' + dog.age); //"名前: ポチ年齢: 1"
```

constructor : 「super()」で親クラスのconstructorを実行する。
constructor以外のメソッド : 「super.メソッド名()」で親クラスのメソッドを実行する。

＊[【JavaScript】superの使い方【クラス継承】](https://tsuyopon.xyz/2019/01/21/how-to-use-the-super-of-classes-in-js/)

###``bind``

```js
function say(){
 console.log("こんにちは。" + this + "です");
}
var taro = say.bind("hoge");
taro(); //こんにちは。hogeです
```

```js
function sum(x, y, z){
    return x + y + z;
}
var keisan = sum.bind(null, 10, 20, 30);
console.log(keisan()); //60
```

関数に対してthisや引数を指定することができるメソッド。

Reactでは、``this.hogehoge = this,hogehoge.bind(this);``のように登場。

＊[JavaScriptでbindメソッドを使う方法](https://techacademy.jp/magazine/14652)


###``非同期処理、コールバック関数``

redux-saga等の理解に不可欠。

```js
const promise = new Promise((resolve, reject) => {
    setTimeout(() => { 
        console.log('hello');
        resolve();
    }, 500);
});

promise.then(() => console.log('world!'));
```

＊[Promiseとasync/awaitでJavaScriptの非同期処理をシンプルに記述する](https://sbfl.net/blog/2016/07/13/simplifying-async-code-with-promise-and-async-await/)

＊[async/await 入門（JavaScript）](https://qiita.com/soarflat/items/1a9613e023200bbebcb3)

＊[XMLHTTPRequest](https://uhyohyo.net/javascript/13_1.html)

＊[Objectのgetとsetについて理解をまとめる](https://se-tomo.com/2019/02/10/【javascript】objectのgetとsetについて理解をまとめる/)

###```イテレータ　ジェネレータ```

これもredux-saga等の理解に不可欠。

```js
function* gfn(n){
    n++;
    yield n;
    n *= 2;
    yield n;
    n = 0;
    yield n;
}

var g = gfn(10); // ジェネレータを作った

console.log( g.next() ); // { value: 11, done: false }
// n++; が実行された後、yield n; によって n の値が返された。

console.log( g.next() ); // { value: 22, done: false }
// n *= 2; が実行された後、yield n; によって n の値が返された。

console.log( g.next() ); // { value: 0, done: false }
// n = 0; が実行された後、yield n; によって n の値が返された。

console.log( g.next() ); // { value: undefined, done: true }
// 関数の実行が終了したので、.done が true になった。
```

＊[JavaScript の イテレータ を極める！](https://qiita.com/kura07/items/cf168a7ea20e8c2554c6)
＊[JavaScript の ジェネレータ を極める！](https://qiita.com/kura07/items/d1a57ea64ef5c3de8528)

#まとめ

これらすべてを理解するとReactのコードが理解できやすくなるのではないでしょうか。
以下のサイトもおすすめです。
□[w3schoolscom](https://www.w3schools.com/js/js_datatypes.asp)
英語ですが、とても分かりやすいです。
実際に手を動かして基礎の理解を深められます。
□[公式ドキュメント](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators)
Reactにも出てくる構文の基礎を固めるのに最適です。

Reactを始める一歩めの記事として[【初心者】React&Redux入門を理解するための超入門/環境構築編](https://qiita.com/tagawahirotaka/items/6e8d1d60b7e0bc174b90)も書いたのでぜひ見てください！