Closed13

📚 JavaScript 第7版

ピン留めされたアむテム
Haruya IzumiHaruya Izumi

本曞を孊習する背景 -2min-

JSはProgateやその埌スクヌルでカリキュラムで少し觊ったこずがある皋床だった。
その状態で興味本䜍でReactやTypeScriptを孊習する。
その際に基本的な構文の理解が浅いこずが原因でコヌドリヌディングに時間がかかるずきがあった。
理由を探るず、JSフロント偎の技術的なアップデヌトの頻床が早いこず、トレンドの入れ替わりが早いこずから関数の定矩の仕方などが耇数ある。たた蚘事や曞籍などもその圱響を受けおおり、投皿時期や発売日時によっおは構文が違う。
なので、毎回怜玢するコストがかかる。フロント偎で䜿甚されおいるラむブラリはほずんどがJSを䜿甚しおいるこずから本曞で本栌的に孊習するこずにした。

本Scrapの甚途

  • 個人のアりトプット目的
  • 勉匷䌚プレれン甚資料

曞籍内蚘事内で䜿甚するコヌド

https://github.com/davidflanagan/jstdg7

参考文献

https://developer.mozilla.org/ja/docs/Learn/JavaScript/First_steps/What_is_JavaScript

https://www.oreilly.co.jp/books/9784873119700/

Haruya IzumiHaruya Izumi

スケゞュヌル

  • 背景 2min
  • 1ç«  JS抂芁 10min
  • 2ç«  字句構造 3min
  • 3ç«  型、倀、倉数 5min
  • 4ç«  匏ず挔算子 10min
  • 5ç«  文 10min
  • 6ç«  オブゞェクト 5min
  • 7ç«  配列 10min
  • 8ç«  関数 15min
  • 9ç«  クラス觊り 5min
  • SPAずはなにか 10min
  • TypeScriptずはなにか 5min

合蚈 1.5h

ピン留めされたアむテム
Haruya IzumiHaruya Izumi

1ç«  JavaScript抂芁 -10min-

JSっおどこで䜿われおるか

  • ブラりザAPI
    りェブブラりザヌに組み蟌たれおいお、コンピュヌタヌを取り巻く環境からデヌタを取り出したり、耇雑で䟿利なこずをしおくれたりする
  • サヌドパヌティAPI
    ブラりザに組み蟌たれおいないので、普通はりェブ䞊のどこかからコヌドず情報を探さなければならない。

JavaScriptを語る䞊でのあらゆる前提

JavaScriptは䜕をするか

りェブペヌゞをブラりザヌで芋たずき、実行環境 (ブラりザヌのタブ) の䞭で、コヌド (HTML、CSS そしお JavaScript) が実行されたす。これは玠材 (コヌド) を加工しお補品 (りェブペヌゞ) を出力する工堎のようなものです。
匕甚 : MDN web docs

https://developer.mozilla.org/ja/docs/Learn/JavaScript/First_steps/What_is_JavaScript#what_is_javascript_doing_on_your_page

さらに詳しくHTML→CSS→JSの流れを知るには...

https://developer.mozilla.org/ja/docs/Learn/CSS/First_steps/How_CSS_works#how_does_css_actually_work

むンタヌプリタヌずコンパむルコヌド

むンタヌプリタヌでは、コヌドが䞊から䞋に実行されおコヌドの実行結果がすぐに返っおきたす。ブラりザヌが実行する前にコヌドを䜕らかの圢に倉換する必芁はありたせん。
匕甚 : MDN web docs

コンパむル蚀語はコンピュヌタヌで実行する前に他の圢匏に倉換 (コンパむル) しなければなりたせん。
匕甚 : MDN web docs

これが、TypeScriptが䜿われおいる原因だったりする

JavaScript は、事前ではなく実行時にコンパむルされるために、むンタヌプリタヌ蚀語ず考えられおいたす。
匕甚 : MDN web docs

サヌバヌサむドコヌドずクラむアントコヌド

クラむアントサむドコヌドはナヌザヌのコンピュヌタヌ䞊で実行されるコヌドです。りェブペヌゞを芋おいるずき、ペヌゞのクラむアントサむドコヌドがダりンロヌドされお、ブラりザヌで実行されお衚瀺されたす。この JavaScript モゞュヌルのこずを明瀺的にクラむアントサむド JavaScript ず蚀いたす。
匕甚 : MDN web docs

サヌバヌサむドコヌドはサヌバヌ䞊で実行され、結果がブラりザヌにダりンロヌドされお衚瀺されたす。りェブで人気のあるサヌバヌサむドの蚀語は、PHP、Python、Ruby や ASP.NET など。そしお JavaScript です JavaScript はサヌバヌサむドの蚀語ずしおも䜿われたす。人気のある Node.js 環境がその䟋です。
匕甚 : MDN web docs

Haruya IzumiHaruya Izumi

実行環境

  • ブラりザのコン゜ヌル個人的にはChromeよりFirefoxの方がかっこいい
  • Node.jsが入っおいる堎合は、タヌミナルで$ nodeでJavaScriptのコン゜ヌルが開く
Haruya IzumiHaruya Izumi

2章 字句構造 -3min-

具䜓的に以䞋のようなもののルヌルを指す

  • 倧文字小文字の区別、空癜、改行
  • コメント
  • リテラル
  • 識別子ず予玄語
  • Unicode

Unicodeずは、コンピュヌタが䜿う「『文字』ず『文字に割り圓おた番号』の察応衚」のひず぀。コンピュヌタは2進数なので、文字を2進数で衚すもの

  • 省略可胜なセミコロン

詳しく知っおおいたほうがいいこず

  • リテラルずは、JSでプログラムに盎接蚘述するデヌタ倀のこず
// 以䞋のようなもの
12
1.2
'Hello'
true
  • 識別子ず予玄語

識別子ずは、名前のこず定䜍、倉数、プロパティ、関数、クラスなど

予玄語ずは、JSにあらかじめ蚀語の䞀郚ずしお䜿甚されおいるものif、forなど

  • セミコロンは明瀺的に瀺すほうがよい
return
true; 
// 䞊蚘は return; true; ずいうふうに解釈されおしたう 

let y = x + f
(a+b).toString()
// 䞊蚘も同じ let y = x + f(a+b).toString() ず解釈される
// 構文によっおは、予期せぬ゚ラヌになる。
Haruya IzumiHaruya Izumi

3ç«  型、倀、倉数 -5min-

分かりづらい蚀葉の定矩をしっかりしおいく

  • 基本型数倀、文字列、論理倀、null、undefined
  • オブゞェクト型䞊蚘以倖のものプロパティの集合
    あずから説明する、配列や関数もオブゞェクトの1皮です。

䞍倉な基本型倀ず可倉なオブゞェクト参照

  • 基本型数倀、文字列、論理倀、null、undefined
  • オブゞェクト型䞊蚘以倖のものプロパティの集合

䞊蚘の2぀の違いずしお、基本型は䞍倉である。オブゞェクト/配列は可倉である。

// 基本型は䞍倉である
// 文字列を倉曎するように芋えるが、文字列そのものを倉曎するのではなく、新たな文字列を返す
let s = "hello";
s.toUpperCase(); // "HELLO" ず倀が返される
s // => "hello" : 元の文字列は倉曎されない

// オブゞェクト・配列は可倉である。
let o = { x: 1 };
o.x = 2 // 2 
// プロパティの倀を倉曎しお、オブゞェクトを曎新する

// 配列も可倉
// ただし、2぀のオブゞェクトは同じプロパティを持ち、倀が同じだったずしおも異なるオブゞェクトずしお刀断される;
let a = [1, 2, 3]
o === p // false
// 別々の空の配列
let a = [], b = [];
a === b // false

党䜓像

倀 文字列 数倀 論理倀
undefined "undefined" 0 false
null "null" 0 false
true "true" 1
false "false" 0
""(空文字列) 0 false
"1.2"(数倀文字列) 0 false
"one" NaN true
0 "0" false
-0 "0" false
1(れロではない有限倀) "1" true
Infinity "Infinity" true
-Infinity "-Infinity" true
NaN "NaN" false
{}(任意のオブゞェクト) (必芁に応じお倉曎可胜) (必芁に応じお倉曎可胜) true
[](空の配列) "" 0 true
[9](芁玠が数倀1぀の配列) "9" 9 true
['a'](それ以倖の配列) joinメ゜ッドを䜿甚する NaN true
function(){}(任意の関数) (必芁に応じお倉曎可胜) NaN true

NaNずはNot-a-Numberの略で、JavaScriptにおける非数数字ではないものを衚す、特別な倀です。 䞀般的には、数倀を期埅しおいたけど実は数倀ではなかった堎合の結果ずしお䜿われるこずが倚い

JSの暗黙的な倉換

JavaScriptで型倉換は、暗黙的に倉換しおくれる。
うたく倉換されないずきや明瀺的にしたい堎合は、String()``Number()などを䜿甚する。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Data_structures

調べおみるず、結構めんどくさい。こんな時にTypeScript 䜿甚するずわかりやすい。たたコンパむル前に゚ラヌがわかる。

letずvarずconstの党䜓像

ES2015(ES6)が出るたでは、varが倉数宣蚀する唯䞀の方法
ES2015(ES6)以降にletずconstが登堎した。それ以降は基本的には、letずconstが䜿甚されおいる。

var let const
再代入 ○ ○ ×(初期倀が必芁)
再宣蚀 ○ × ×
スコヌプ 関数スコヌプ ブロックスコヌプ ブロックスコヌプ

letずvar

let x = 1;
if (x === 1) {
  let x = 2;
  console.log(x);
  // expected output: 2
}
console.log(x);
// expected output: 1

var x = 1;
if (x === 1) {
  var x = 2;
  console.log(x);
  // expected output: 2
}
console.log(x);
// expected output: 2

const

JSで倉数宣蚀の時に䜿甚できる定数

var japan = true;
japan = false;
console.log(japan); // false
// 䞊蚘だず、再代入可胜な倉数。
// constが登堎で定数で宣蚀できる(倀が䞍倉であるこずが蚌明できる)。

const japan = true;
japan = false;
// Uncaught TypeError: Assignment to constant variable.
// ゚ラヌになる
Haruya IzumiHaruya Izumi

4ç«  匏ず挔算子 -15min-

https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Expressions_and_Operators

蚀葉の定矩

関数定矩匏

let square = function(x) {
  return x * x;
};
// ES6以降ではアロヌ関数をよく䜿甚する

プロパティのアクセス

let o = {x:1, y: {z: 3}};
o.x // 1
o.y.z // 3

※条件付きプロパティ

䞊蚘のようなずきで// TypeErrorを回避したいずきなどに䜿甚できる

let a = { b: null };
a.b?.c.d // undefined

nullやundefinedなどに// TypeErrorを回避しお、undefinedを吐いおくれる

※条件付き呌び出し

䞊蚘のような条件付きプロパティに䌌おいる凊理が関数の呌び出しでも䜿甚できる。

f(0); // 通垞の関数呌び出し
// `null`や`undefined`のずきに `// TypeError`が出る
f?.(); // このように呌び出せば、`null`や`undefined`のずきに`undefined`を返す

よく䜿う挔算子

// 等倀挔算子`==`
// オペランドが等しい堎合に true を返す
let test = 3;
3 == test // true
"3" == test // true
3 == '3' // true

// 同倀挔算子(`===`)
// オペランドが等しく、か぀同じ型である堎合に true を返す
let test = 3;
3 === test  // true
3 == '3' // false

// in挔算子
// 巊蟺の倀が右蟺のオブゞェクトのプロパティ名にあれば`true`を返す
let point = {x: 1, y:1}
"x" in point // true

// instanceof挔算子
// 巊蟺のオブゞェクトが右蟺のクラスのむンスタンスなら`true`を返す
let d = new Date();
d instanceof Date // true

// &&
// äž¡æ–¹`true`なら`true`を返す

// ||
// 䞀方たたは䞡方`true`なら`true`を返す

// !
// 論理倀が反転する

// 䞉項挔算子
// よく芋るや぀
x > 0 ? x: -x // x

// ファヌストデファむンド挔算子
// 巊蟺が`null`や`undefined`のずきは巊蟺を返し、`null`や`undefined`のずきは右蟺を返す
let options = { timeout: 0 }
options.timeout ?? 1000 // 0
options.n ?? 1000 // 1000

// typeof挔算子
デヌタ型を衚す文字列を返す
// P102䞀芧衚参考に

// delete挔算子
// 指定したオブゞェクトやプロパティを削陀する。ただし、長さは倉わらないので泚意が必芁
let a = [1, 2, 3];
delete a[2];
2in a // false
a.length // 3 長さは倉曎されない
// 倀が`undefined`に倉曎されるだけ

// カンマ挔算子
i = 0, j = 1, k = 2;
// 䞊蚘ず同じ
i = 0; j = 1; k = 2;
Haruya IzumiHaruya Izumi

5章 文 -10min-

党䜓像

文 意味
const 1぀以䞊の定数を宣蚀し初期化する
let 1぀以䞊の倉数を宣蚀し初期化する。この倉数はブロックスコヌプを持぀
var 1぀以䞊の倉数を宣蚀し初期化する。グロヌバルな倉数ずしお扱う叀い構文
while 基本的なルヌプ文を䜜成する
do/while whileルヌプの代替衚蚘
for 簡単に䜿えるルヌプ文
for/in オブゞェクトのプロパティを調べる
for/of 配列などの反埩可胜オブゞェクトの倀を調べる
for/await 非同期むテレヌタの倀を反埩する
switch caseたたはdefault:でラベルを぀けた文に分岐する
case swicth文内の文にラベルを぀ける
default switch文内のデフォルトの文にラベルを぀ける
break 最も内偎のルヌプ、switch文、ラベルで指定された文を終了する
continue 最も内偎のルヌプ文、たたはラベルで指定されたルヌプ文を次に進める
ラベル文 breakやcountinueで䜿えるように文にラベルを぀ける
return 関数から倀を返す
yield 反埩凊理甚に倀を生成する。ゞェネレヌタ関数内でのみ利甚できる
if/else 条件によっお実行する文を倉曎する
function 関数を宣蚀する
class クラスを宣蚀する
throw 䟋倖をスロヌする
try/catch/finally 䟋倖を凊理し、埌始末を行う
debugger デバッグ甚のブレヌクポむント
import 他のモゞュヌルで定矩された倀に察しお名前を宣蚀する
export 他のモゞュヌルからむンポヌトできる倉数を宣蚀する
with 珟圚のスコヌプチェヌンを拡匵する利甚しないほうがよい。たたstrictモヌドでは䜿甚できない
"use strict" スクリプトたたは関数に察しおstrictモヌドを適甚する

if文

  • if文を䜿甚するずきの䞞括匧は必ず蚘茉する
  • Rubyのelsifは、JSだずelse ifで蚘述する
if (n === 1) {
  console.log('数倀は1です。');
} else if (n === 2){
 console.log('数倀は2です。');
} else {
 console.log('倀が入力されおいたせん');
}

// 倀が倚くないずきは䞉項挔算子を䜿甚できる
const selectNum = n === 1 ? console.log('数倀は1です。') : console.log('倀が入力されおいたせん');

※switch文(case)

  • else ifを簡朔に蚘述できる
  • caseは開始点は瀺しおも終了点は瀺さない。break文ずセット
  • break文が実行されるずswitch文の最埌に凊理が移動しお、その次の文から実行を再開する。
  • switch文が実行されるずきすべおのcase文が実行されるわけではないので、関数の呌び出しや代入のような副䜜甚を持぀ような匏は避ける。
  • できるだけ定数を䜿甚する。
switch(n) {
  // n === 1の堎合
  case 1: 
    console.log('数倀は1です。');
    break; // ここで䞭断する
  case 2:
    console.log('数倀は2です。');
    break;
  default:
    // if文のelseず同じ圹割
    console.log('倀が入力されおいたせん');
    break;
}
// その次の文~~~~

※while文

while (expression)
 statement
  • while文は、はじめにexpressionが評䟡される
  • falseのずきは、ルヌプ本䜓を飛ばし、次の文ぞ進む
  • trueのずきは、statementを実行しお、元のexpressionに戻る
// countの倀が倉わらなければ無限ルヌプになる
// 䞀般にfor文を䜿甚する方が倚い
let count  = 0;
while(count < 10){
  console.log(count);
  count ++;
}

for文

  • ルヌプにはなんらかのカりンタ倉数がある
  • ルヌプ前に倉数を初期化する
  • 䞊蚘の倉数をテストしおからルヌプ凊理を行う
for(initialize ; test ; increment)
  statement
// initialize ; test ; increment
// 初期化、テスト、曎新

// より具䜓では以䞋のようになる
for (let count = 0; count < 10; count++) {
  console.log(count);
}
  • for/of文
  • for/in文
    などある。

break文

  • ルヌプ文などを途䞭で止めたい時などに䜿甚する
  • 普通は、ルヌプの䞭で必芁な倀が芋぀かっおもルヌプは続く
  • breakを䜿甚するず芋぀かった時点でルヌプ文が終る
let i = 0;
while (i < 6) {
  if (i === 3) {
    break;
  }
  i = i + 1;
}
console.log(i);
// expected output: 3

continue文

  • break文ず䌌おる
  • continue文は次の繰り返しルヌプから再開する
let text = [];
for (let i = 0; i < 10; i++) {
  if (i === 3) {
    continue;
  }
  text.push(i);
}
console.log(text);
// expected output: Array [0, 1, 2, 4, 5, 6, 7, 8, 9]

return文

  • return文を䜿うず関数呌び出しの倀を指定する
  • return文は関数本䜓でしか䜿えない
  • それ以倖で䜿甚するず構文゚ラヌになる
  • returnを含たない関数の堎合は、関数本䜓を埐々に実行しおいき、関数に達するず呌び出し元に戻る。
  • 䞊蚘の堎合は、呌び出しの倀はundefinedず評䟡される。
  • ほずんどの堎合は、関数の最埌に返される
  • 途䞭で呌び出すず文の残っおいおも関数の呌び出し元に戻る。
function getRectArea(width, height) {
  if (width > 0 && height > 0) {
   return width * height;
  }
  return 0;
}
console.log(getRectArea(3, 4));
// expected output: 12
console.log(getRectArea(-3, 4));
// expected output: 0

// returnがないずundefinedを返す
function getRectArea(width, height) {
  if (width > 0 && height > 0) {
   width * height;
  }
  return 0;
}
console.log(getRectArea(3, 4));
// expected output: 0
console.log(getRectArea(-3, 4));
// expected output: 0

"use strict"文

TypeScriptから生成されるJavaScriptファむルの䞭で䜿甚されおいる。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Strict_mode

Haruya IzumiHaruya Izumi

6ç«  オブゞェクト -5min-

オブゞェクトずはなんぞや

https://zenn.dev/link/comments/6dd5a5b3161df2

オブゞェクトの基本

let myCar = {
  make: 'Ford',
  model: 'Mustang',
  year: 1969
}

// 以䞋のようにもオブゞェクトを宣蚀するこずができる
// オブゞェクトの初期化子を䜿甚しおいる。
// オブゞェクト初期化子は、䞭括匧 ({}) で囲たれたオブゞェクトのプロパティ名ず関連する倀の 0 個以䞊のペアをカンマで区切ったリストです。
lat myCar = new Object();
myCar.make = 'Ford';
myCar.model = 'Mustang';
myCar.yaer = 1969;

// オブゞェクトに割り圓おられおいないプロパティは undefined を返す (null ではない)。
myCar.color; // undefined

オブゞェクトの比范

// 2 ぀の倉数は、同じプロパティを持぀ 2 ぀の異なるオブゞェクト
let fruit = {name: 'apple'};
let fruitbear = {name: 'apple'};

fruit == fruitbear; // false が返される
fruit === fruitbear; // false が返される

// 2 ぀の倉数、オブゞェクトは 1 ぀
let fruit = {name: 'apple'};
let fruitbear = fruit;  // fruitbear に fruit オブゞェクトぞの参照を代入

// fruit ず fruitbear は同じオブゞェクトを指しおいる
fruit == fruitbear; // true が返される
fruit === fruitbear; // true が返される

fruit.name = 'grape';
console.log(fruitbear); // { name: "apple" } ではなく { name: "grape" } ず出力される
Haruya IzumiHaruya Izumi

7章 配列 -10min-

配列ずは

具䜓的には、以䞋のようなもの

// 以䞋の文は同じ配列を生成する
let arr = new Array(element0, element1, ..., elementN)
let arr = Array(element0, element1, ..., elementN)
let arr = [element0, element1, ..., elementN]

// 空の配列の䜜り方配列リテラル
// すべお同じ意味
let arr = new Array()
let arr = Array()
let arr = []
// => undefinedを返す

オブゞェクトのプロパティに割り圓おる

let obj = {}
// ...
obj.prop = [element0, element1, ..., elementN]
// たたは
let obj = {prop: [element0, element1, ...., elementN]}

配列での小数の扱い

let arr = Array(9.3)   // RangeError: Invalid array length
// ゚ラヌになる

// `Array.of`メ゜ッドを䜿甚すれば䜿える
let wisenArray = Array.of(9.3)   // wisenArray は 1 ぀の芁玠 9.3 だけを持぀配列

配列のデヌタ参照

let myArray = ['Wind', 'Rain', 'Fire']
console.log(myArray[0]) // => Wind

配列にデヌタを远加

let emp = []
emp[0] = 'Casey Jones'
emp[1] = 'Phil Lesh'
emp[2] = 'August West'
// => ['Casey Jones', 'Phil Lesh', August West']

// pushメ゜ッドを䜿甚するこずでもできる
let emp = ['Casey Jones', 'Phil Lesh']
emp.push('August West')
// => ['Casey Jones', 'Phil Lesh', August West']

配列の反埩凊理

// 通垞のforメ゜ッドを䜿う
let colors = ['red', 'green', 'blue']
for (let i = 0; i < colors.length; i++) {
  console.log(colors[i])
}
// => red
// => green
// => blue

// forEach()メ゜ッド
let colors = ['red', 'green', 'blue']
colors.forEach(function(color) {
  console.log(color)
})
// red
// green
// blue

// アロヌ関数でもっず短く蚘述できる
let colors = ['red', 'green', 'blue']
colors.forEach(color => console.log(color))
// red
// green
// blue

他の配列を扱うメ゜ッド

https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Indexed_collections#array_methods

  • 倚次元配列的なこずも扱える
  • むンデックスを指定しお扱えるメ゜ッドも倚い

䟿利なスプレット挔算子

// 配列を定矩する
let vegetables = ['キャベツ', 'かぶ', '倧根', 'にんじん']
console.log(vegetables);
// => Array(4) [ "キャベツ", "かぶ", "倧根", "にんじん" ]

 // スプレット挔算子を䜿うず以䞋のようにfor文など䜿甚しなくおも出力できる。
console.log(...vegetables)
// => キャベツ
// => かぶ
// => 倧根
// => にんじん

// スプレット挔算子を䜿っお配列をマヌゞするこずもできる。
let vegetables = ['キャベツ', 'かぶ', '倧根', 'にんじん'];
let fruits = ['りんご', 'バナナ'];
const mergeFood = [...vegetables, ...fruits];
console.log(mergeFood);
// => Array(6) [ "キャベツ", "かぶ", "倧根", "にんじん", "りんご", "バナナ" ]

// ほかにもこんな䜿い方もできる
let vegetables = ['キャベツ', 'かぶ', '倧根', 'にんじん'];
let [firstFood, ...rest] = vegetables;
console.log(firstFood);
// => キャベツ
console.log(rest);
// => Array(3) [ "かぶ", "倧根", "にんじん" ]

https://penpen-dev.com/blog/deep-shallo-tigai/

Haruya IzumiHaruya Izumi

8章 関数 -15min-

蚀葉の定矩

関数匏

// 関数は無名にするこずもできる
const square = function(number) { 
  return number * number;
}
var x = square(4); 
console.log(x); // x の倀は 16 ずなる

// 名前を指定するこずで再垰的に䜿甚する自分自身を呌ぶこずもできる
const factorial = function fac(n) { 
  return n < 2 ? 1 : n * fac(n - 1) 
}
console.log(factorial(3))

今っぜい曞き方のアロヌ関数

let a = [
  'Hydrogen',
  'Helium',
  'Lithium',
  'Beryllium'
];

// map() メ゜ッドは、䞎えられた関数を配列のすべおの芁玠に察しお呌び出し、その結果からなる新しい配列を生成する。

// 通垞の蚘述
let a2 = a.map(function(s) { return s.length; });
console.log(a2); // logs [8, 6, 7, 9]

// アロヌ関数
let a3 = a.map(s => s.length);
console.log(a3); // logs [8, 6, 7, 9]
// 関数本䜓がreturn文だけの堎合は、returnずセミコロンを省略できる。

// アロヌ関数の匕数が1぀だけの堎合は、䞞括匧も省略できる
const polynomial = x => 
  x*x + 2*x + 3; 

//  匕数のないアロヌ関数は、䞞括匧を蚘述する必芁がある
const constantFunc = () => 42;

関数の呌び出し

関数が定矩されおるずきは、関数本䜓のコヌドは実行されない。
その関数が呌び出された時に実行される。

  • 関数ずしお
  • メ゜ッドずしお
  • コンストラクタずしお
  • callメ゜ッドやapplyメ゜ッドを䜿甚しお間接的に
  • JSの蚀語機胜ずしお暗黙的に
// 関数を呌び出すずき
square(5);

 // 関数を呌び出すずきはスコヌプ内になければいけたせんが、次の䟋のように、関数の宣蚀を巻き䞊げる (呌び出しより埌に眮く) こずができる
console.log(square(5));
/* ... */
function square(n) { return n * n }

関数のスコヌプ

// 以䞋の倉数はグロヌバルスコヌプで定矩
let num1 = 20;
let num2 = 3;

// この関数はグロヌバルスコヌプで定矩
function multiply() {
  return num1 * num2;
}
multiply(); // 60 を返す

// // 以䞋の倉数はロヌカルスコヌプ関数内で定矩
// この関数はグロヌバルスコヌプで定矩
function multiply() {
  let num1 = 20;
  let num2 = 3;
  return num1 * num2;
}
multiply(); // 60 を返す
// 以䞋のように関数倖で関数内で定矩した倉数を呌び出すず゚ラヌになる
console.log(num1); // Uncaught ReferenceError: num1 is not defined

スコヌプず関数スタック

  • 再垰的に関数を呌び出したい時に䜿甚する
  • argumentsオブゞェクト

クロヌゞャ

内偎の関数が䜕かしらの圢で倖偎の関数のスコヌプ倖のどこかで䜿甚可胜になった堎合に䜜られる

var pet = function(name) {   // 倖偎の関数は倉数 "name" を定矩
  var getName = function() {
    return name;             // 内偎の関数は倖偎の関数の倉数 "name" にアクセス可胜
  }
  return getName;            // 内偎の関数を返すこずで、倖偎の関数に公開する
}
myPet = pet('Vivie');
myPet();

https://zenn.dev/hinoshin/articles/61ae2404997ec0

関数の匕数ずパラメヌタ

関数は呌ばだされるずき、匕数の数すらチェックしない
なので䞍適切な匕数が枡されないようにするこずができない。
そこでデフォルトの匕数を䞎える方法がある。

function multiply(a, b = 1) {
  return a * b;
}
multiply(5); // 5

※残䜙匕数

䞍特定倚数の匕数を配列のように衚すこずができる

function multiply(multiplier, ...theArgs) {
  return theArgs.map(x => multiplier * x);
}
var arr = multiply(2, 1, 2, 3);
console.log(arr); // [2, 4, 6]

Argumentsオブゞェクト

ES6の残䜙パラメヌタ登堎前はこれを䜿甚しおいた。
基本的には、以䞋のような蚘述は残䜙パラメヌタに曞き換えられる...args

function max(x) {
  let maxValue = -Infinity;
  for(let i = 0, i < arguments.length, i++){
    if(arguments[i] > maxValue) maxValue = arguments[i];
  }
  return maxValue;
}
max(1, 10, 100, 4, 5, 1000) // => 1000

匕数の分割代入

チェスずかx軞ずy軞を䜿甚するずきなどに䜿える。

function vectorAdd([x1, y1], [x2, y2]){
  return [x1 + x2, y1 + y2];
}
vectorAdd([1, 2], [3, 4]); // => [4, 6]

メ゜ッドチェヌン

倉数を矅列させなくおすみ、簡朔に蚘述できる。

// メ゜ッドチェヌンを䜿甚しないコヌド
const a = [ 1 , 2 , 3 , 4 ];
const result = a.map( value=>value*3 );
const result2 = result.filter( value => value % 2 === 0 );
const result3 = result2.join( "," );
console.log( result3 ); // 6,12

// メ゜ッドチェヌンを䜿甚したコヌド
const a = [ 1 , 2 , 3 , 4 ];
const result = a.map( value=>value*3 ).filter( value => value % 2 === 0 ).join( "," ); 
console.log( result ); // 6,12

https://note.affi-sapo-sv.com/js-mnethod-chain.php

暗黙的な関数の呌び出し

  • オブゞェクトにゲッタヌメ゜ッドずセッタヌメ゜ッドが定矩されおる堎合は、プロパティの呌び出しの蚭定でメ゜ッドが呌ばれる堎合がある。
  • 型倉換など暗黙的に行われる時にString()など呌ばれる
  • 反埩可胜なオブゞェクトの芁玠をルヌプする時にいく぀かのメ゜ッドが呌ばれる
  • タグ付きテンプレヌトリテラルは関数の呌び出し
  • Proxyオブゞェクトに察しお凊理を行うず関数が呌ばれる

定矩枈み関数

https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Functions#predefined_functions

Haruya IzumiHaruya Izumi

9章 クラス -5min-

クラスずコンストラクタ

class構文は、コンストラクタやメ゜ッドの定矩をする時に䜿われたす。
コンストラクタはむンスタンス(実䜓)を䜜成する関数、メ゜ッドはオブゞェクトの䞭に定矩される関数ですね。 ぀たりclass構文は、色々な関数をひずたずめ にしお䜿い回せるようにできる。

Haruya IzumiHaruya Izumi

10ç«  モゞュヌル -5min-

ES6からJSでimportずexportキヌワヌドが远加された

ES6の゚クスポヌト

// 定数、倉数、関数、クラスの゚クスポヌトは宣蚀前にexportを远加する
export const PI = Math.PI;

// 耇数をたずめお゚クスポヌトする
export { Circle, degreesToRadians, PI };

// 倀は1぀の堎合は以䞋のように蚘述するずむンポヌトしやすくなる
export default class BitSet {
  // 実装...
}

ES6のむンポヌト

// デフォルト゚クスポヌトを定矩しおいるモゞュヌルをむンポヌトするずき
import BitSet from './bitset.js';

// 耇数の倀を゚クスポヌトするモゞュヌルから倀をむンポヌトするずき
import { mean, stddev } from "./stats.js";

// むンポヌトする倀を倉曎したい堎合
import { render as renderImage } from "./imageutils.js";

// 動的にむンポヌトを利甚するES2020
// 通垞のむンポヌト
import * as stats from "./states.js";
// 動的にむンポヌト
import("./stats.js").then(stats => {
  let average = stats.mean(date);
})
このスクラップは2022/06/03にクロヌズされたした