1990年代にJSと JScriptという二つの言語がライバル関係にあった。その二つの言語間に仕様の差異があったため、ecmascriptが生み出された。、
上記はJSのコアの部分を切り出した言語仕様。この仕様に基づいて実装された言語がJS
JSは実行する環境によって使える機能が異なる
JSとブラウザ
JavaScriptエンジン ブラウザによって変わる
初期化値なども異なる場合があるため、注意が必要

web APIs https://developer.mozilla.org/ja/docs/Web/API

EdgeはV8 に移行中
JSが実行されるまで


グローバルオブジェクト
JSエンジンによって生成されるどこからでもアクセスできるオブジェクト
実行前にグローバルオブジェクト(Windowオブジェクト)、thisが準備される。
実行コンテキスト
context:文脈
コードを実行する際の文脈や状況を指す
グローバルコンテキスト

関数コンテキスト

コールスタック
実行中のコードがたどってきたコンテキストの積み重ね
LIFO(後入れ先出し方式)
ホイスティング(宣言の巻き上げ)
コンテキスト内で宣言下変数や関数の定義をコード実行前にメモリに配置すること。
var:undifinedによる初期化がされる
let/const :undifinedによる初期化がされずエラーとなる
スコープ
実行中のコードから、値と式が参照できる範囲
変数

データ型
プリミティブ型
String / Number / Boolean / Undefined / Null / Symbol / BigInt
オブジェクト型
プリミティブ型以外(関数も含む)
関数
関数名によって判別している。引数の数が違っても関数名が重複していた場合、後に定義したものが優先される。
function(a, b=1){};
引数にデフォルト値を設定することも可能。undefinedの時はデフォルト値が優先される。
argumentsには実引数が渡ってくる。
関数は実行可能なオブジェクト
コールバック関数
関数の引数に渡される関数のこと
function hello(name){
console.log('hello' + name);
};
function bye(){
console.log('bye');
};
function fn(cb){
cb('Tom');
};
fn(hello);
this
呼び出し元のオブジェクトへの参照を保持するキーワード
実行コンテキストによって参照先が変わるので注意
オブジェクトのメソッドとして呼び出された場合
呼び出し元のオブジェクトを参照する
関数として呼び出された場合
グローバルオブジェクトを参照する
参照のコピーとthis
Boolean
falsyな値:0, -0, null, false, NaN, undefined あるいは空文字列 ("")
truethyな値:それ以外