js-primerを読んだ

この書籍について · JavaScriptの入門書 #jsprimerという神サイトを読んで学んだことと疑問点

学んだこと

- 変数は大文字、小文字を区別する

- Automatic Semicolon Insertion
=> ; がないときに自動でついてくれる仕組み 

"use strict"
=> #include <stdio.c>的なものかと思っていた
strict modeで実行してレガシーな機能や構文を禁止

HTML-likeコメント
=> こういうやつ。名前を知らなかった
<!-- この行はコメントと認識される
console.log("この行はJavaScriptのコードとして実行される");
-->  この行もコメントと認識される

参照透過性
=> 定義した中身が常に一定あること

可能な限りconstを使う
constは定数ではない
ex. objectの中身を変更できる

REPL(read–eval–print loop)
よく使う開発者ツールでJavascriptを実行できるやつ

データ型
=> プリミティブ型とオブジェクト

プリミティブ型
=> 真偽値や数値などの基本的な値の型
イミュータブル

オブジェクト
=> ミュータブル

typeof nullが"object"となるのは、歴史的経緯のある仕様のバグ

基本的にtypeof演算子は、プリミティブ型またはオブジェクトかを判別するもの

リテラル
=> new String("string")とするが標準で使うので、const "string"みたいにできるもの

0から始まる浮動小数点数は、0を省略して書くことができる
=> 使わない方が良い

テンプレートリテラル
=> ``で囲む。複数行の文字列を表現

nullもリテラル

undefinedはリテラルではない
=> ただのグローバル変数

オブジェクトリテラル
プロパティ名
=> objectのkey

単項プラス演算子(+)
=> 数値文字列を数値にするときに利用
ex. console.log(+"1"); // => 1
parseIntなどを使うべき

NaNは、数値ではないがNumber型の値を表現
console.log(NaN === NaN); // false
=> .isNaNで判断

 分割代入
=> 配列やオブジェクトの値を複数の変数へ同時に代入する

const array = [1, 2];
// aには`array`の0番目の値、bには1番目の値が代入される
const [a, b] = array;
console.log(a); // => 1
console.log(b); // => 2


falsyな値
----
false
undefined
null
0
NaN
""(空文字)
----

Javascriptは、関数の仮引数と呼び出しものと引数の数が異なっても実行可能

Rest parameters
=> 仮引数名の前に...をつけた仮引数のこと

こういうのはしっかり理解したい
const user = {
    id: 42
};
// オブジェクトの分割代入
const { id } = user;
console.log(id); // => 42

ファーストクラスファンクション(第一級関数)
=> 関数が値として扱えること
こういうのメタプロRubyでみた気がする....

### 関数式
=> こういうやつ。これよく出るが、雰囲気で読んでたので理解
// 関数式は変数名で参照できるため、"関数名"を省略できる
const MoringGreetings = function SayHello(){
  return "Hello";
}
ここで、関数式の関数名は省略できるので....
const MoringGreetings = function (){
  return "Hello";
}
と等価。これを無名関数(匿名関数)と呼ぶ

### Arrow function
無名関数の表現技法

const 関数名 = () => {
    // 関数を呼び出した時の処理
    // ...
    return 関数の返す値;
};

みたいに書ける。

ここで、
1. 関数の仮引数が1つのときは()を省略できる
2. 関数の処理が1つの式である場合に、ブロックとreturn文を省略できる
その式の評価結果をreturnの返り値とする

という省略記法があるので
const mulA = {x} => { return x * x; };
const mulB = x => x * x;
は等価
ここで注意しないといけないのは。=  x =  のxは仮引数であるということ

### コールバック関数
引数として渡される関数

### 高階関数
コールバック関数を引数として使う関数やメソッド

コールバック関数と高階関数の理解が絶対いる

objectのメソッドの短縮記法がES2015で登場

### Array length
=> このテクニック面白い
const array = [1, 2, 3];
array.length = 0; // 配列を空にする

### テンプレートリテラル
バックスラッシュで文字を囲むこと
複数行にしたり、Rubyの式展開みたいなことができる
const name = "JavaScript";
console.log(`Hello ${name}!`);

JavaScriptの文字列比較はCode Unit同士を比較

Arrow Function以外の関数におけるthisの基本的な参照先は
ベースオブジェクトである。thisは、動的に参照先を決定するので
変数などに代入すると、Errorとなる。
そのためにcall、apply、bindメソッドを使って対処する。

疑問に思ったこと

Q. オブジェクトは、ミュータブルだからconstでも再代入できる?
A. オブジェクトを代入した変数はデータの実体を持ってるわけではなくて、データが存在するメモリの番地を指してるだけだから、constで宣言した際に、変数そのものに再代入(番地を上書き)するのはアカンけど、プロパティを変更するのは再代入にあたらない

暗黙的な型変換があって便利なことってある?
バグの原因にしかならない気がする

関数の渡す引数が、実際より多いときに、エラーを吐かないのは便利なのか?

再帰処理とかするときには、無名関数は無理?

課題

Array functionを頭の中で、functionで置き換えられるようにしないと勘違いする

ex. 
const doubleArray = array.map(function(value) {
    return value * 2; // 返した値をまとめた配列ができる
});
const doubleArray = array.map(value => value * 2);