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);