Yunosuke Minegishi
    • Create new note
    • Create a note from template
      • Sharing URL Link copied
      • /edit
      • View mode
        • Edit mode
        • View mode
        • Book mode
        • Slide mode
        Edit mode View mode Book mode Slide mode
      • Customize slides
      • Note Permission
      • Read
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Write
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Engagement control Commenting, Suggest edit, Emoji Reply
    • Invite by email
      Invitee

      This note has no invitees

    • Publish Note

      Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

      Your note will be visible on your profile and discoverable by anyone.
      Your note is now live.
      This note is visible on your profile and discoverable online.
      Everyone on the web can find and read all notes of this public team.
      See published notes
      Unpublish note
      Please check the box to agree to the Community Guidelines.
      View profile
    • Commenting
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
      • Everyone
    • Suggest edit
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
    • Emoji Reply
    • Enable
    • Versions and GitHub Sync
    • Note settings
    • Note Insights New
    • Engagement control
    • Make a copy
    • Transfer ownership
    • Delete this note
    • Save as template
    • Insert from template
    • Import from
      • Dropbox
      • Google Drive
      • Gist
      • Clipboard
    • Export to
      • Dropbox
      • Google Drive
      • Gist
    • Download
      • Markdown
      • HTML
      • Raw HTML
Menu Note settings Note Insights Versions and GitHub Sync Sharing URL Create Help
Create Create new note Create a note from template
Menu
Options
Engagement control Make a copy Transfer ownership Delete this note
Import from
Dropbox Google Drive Gist Clipboard
Export to
Dropbox Google Drive Gist
Download
Markdown HTML Raw HTML
Back
Sharing URL Link copied
/edit
View mode
  • Edit mode
  • View mode
  • Book mode
  • Slide mode
Edit mode View mode Book mode Slide mode
Customize slides
Note Permission
Read
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Write
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Engagement control Commenting, Suggest edit, Emoji Reply
  • Invite by email
    Invitee

    This note has no invitees

  • Publish Note

    Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

    Your note will be visible on your profile and discoverable by anyone.
    Your note is now live.
    This note is visible on your profile and discoverable online.
    Everyone on the web can find and read all notes of this public team.
    See published notes
    Unpublish note
    Please check the box to agree to the Community Guidelines.
    View profile
    Engagement control
    Commenting
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    • Everyone
    Suggest edit
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    Emoji Reply
    Enable
    Import from Dropbox Google Drive Gist Clipboard
       Owned this note    Owned this note      
    Published Linked with GitHub
    • Any changes
      Be notified of any changes
    • Mention me
      Be notified of mention me
    • Unsubscribe
    りあクト!輪読会 # 2021年8月22日 ### Node.jsはなぜ必要? - JavaScriptsはWeb上(ブラウザ上、クライアントサイド)で動かすための言語 - Node.jsとはJavaScriptsをローカル上で動くようにするためのソフトウェア - Node.jsを使うと、JavaScriptをRubyやPhytonみたいにサーバーサイド言語として使えるようになる - npm(NodePackageManager)とはrubyでいうbundlerのようなもの、バージョン管理ツール - rails sでローカルが起動した時にサーバー立ち上げ(rackとかミドルウェアも含んで)とwebpackerが自動で走ってくれていたりしてる? - パッケージとは、JavaScriptのプラグインやモジュールのこと ### Node.jsをインストールしてみよう - UbuntuはOS、Linuxの一族 - Node.jsはバージョンマネージャーを使ってプロジェクトごとに異なるバージョンをインストールするのが一般的。 - バージョンマネージャーとしてnvmやnodenvが一般的 - `mkdir -p` (-pはオプションで必要に応じてディレクトリも作成する) - `node global 14.4.0`とすることでデフォルトのバージョンを指定できる - `node local 14.4.0`とすることでディレクトリごとにバージョン指定ができる - Yarnはnpmの改良版。より高速、サブコマンドのタイピング数が少ない。 - `$ node`はrubyでいう`$ irb`コマンド (REPL(リプル)っていうらしい) - `anyenv update`で現在インストール可能なバージョンを取得できる。 - `node`で対話環境でnodeが実行できる。 - 終了するときは`.exit` ### npmってなんだ?! npmとは、「Node Package Manager」の略で、その名の通りNode.jsのパッケージを管理するためのシステムのことです。 ここでいうパッケージとは、JavaScriptのプラグインやモジュールのことです。 nodenvがNode.jsのバージョンの管理 npmがJavaScriptのパッケージ(BootstrapみたいなjQueryみたいな)の管理 ### VScode使おうぜ? - VScodeはTypeScriptと相性が良い。 - 同時コーディングとかめっちゃ便利やで。 ## 参考 初心者向け!3分で理解するNode.jsとは何か? https://eng-entrance.com/what-is-nodejs#PHP 知っておいて損はなし!新人Webデザイナーのための「npm」入門 https://ferret-plus.com/6104 ESLint 最初の一歩 https://qiita.com/mysticatea/items/f523dab04a25f617c87d コンテンツデリバリネットワーク (CDN) https://wa3.i-3-i.info/word16730.html https://wpmake.jp/contents/knowledge/about_cdn/#CDN%E3%81%AE%E3%83%87%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88 --- --- # 2021年8月27日 ## Create React Appは何をしてくれているのか CRA(Create React App)とはFacebook社が社内でReactを使うときに使っていた環境整備の方法をコマンド化したもの。 実行することでアプリケーションのスケルトン(空のアプリ)が生成される。 <br> `$ create-react-app`コマンドで作られるもの - react ・・・ React 本体のパッケージ - react-dom ・・・ DOMを抽象化してReactから操作できるようにするレンダラーのパッケージ - react-scripts - Babel : 新しい仕様のJSのコードを古いブラウザでも実行できるようにコンパイルする - webpack - webpack-dev-server : ソースコードの変更を検知してリロードしなくてもリアルタイムに画面反映してくれる - Jest : JavaScriptの単体テストのフレームワーク(RailsのRSpecみたいな書き方) - dotenv <br> <br> ## Create React Appで「Hello, World!」 ### npxコマンド npmがインストールされていば、ネット経由で最新版ないし該当のパッケージをインストールし**一回のみ**実行してくれる。実行した後はキレイに削除してくれる。 ### 実際にハンズオン! `$ npx create-react-app hello-world --template=typescript` →TypeScriptのためのテンプレートを指定(このオプションを指定しないと素のJSで開発するためのcra-templateが適応される) * 上記コマンドはrails newと同じ役割だと想像してください。ディレクトリの移動を忘れないよう気をつけましょう。 * `cd hello-world` ←これやってから① * `yarn start` ←これやってね② <br> --- ### CRA実行時のエラー ```typescript= pretty-format@27.1.0: The engine "node" is incompatible with this module. Expected version "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0". Got "14.4.0" ``` 記述されているnodeのversion以上を期待している。 エラー発生時は14.4.0だった。 14.15.0にすることで対応。 --- **回った!!** ![](https://i.imgur.com/Uy43Jz4.png) <br> ## 参考 Ruby on Railsの動作にNode.jsが必要な理由 https://www.xenos.jp/~zen/blog2/index.php/2019/03/19/post-1831/ 【3分でわかるシリーズ】Ubuntuとは? https://eng-entrance.com/what-is-ubuntu JavaScriptを単体テストする流行りのフレームワークJestを試してみる https://qiita.com/mima_ita/items/558ec8cee2c0e1005ffd # 2021年8月31日 ```typescript= ReactDOM.render( <React.StrictMode> <App /> </React.StrictMode>, document.getElementById('root') ); ``` `ReactDOM.render()`は第2引数の中に第1引数を入れ込む感じ。 `<React.StrictMode>`はバージョンが進んで非推奨になったAPIの使用や意図しない問題点を見つけてwarningで教えてくれるReactの「Strictモード」を有効にするためのラッパー。 ## DOM めっちゃ簡単にいうと、検証ツールで見れるElementsの部分。 HTMLタグで囲まれてツリー構造になっているもの。 ## コンポーネント Reactで作られるアプリケーションは全てコンポーネントで構成される。 任意のUIを表現するためのパーツの単位。 ## パスカルケース = アッパーキャメルケース 各単語の最初を必ず大文字で書き表す記法。 ## JSXとは HTMLのように見えてHTMLではない、JavaScriptの拡張構文 JavaScriptの中で記述できるHTML風の記法 ## ホットリロード ファイル保存時に自動でブラウザに反映される機能 # 1-3 アプリを管理するためのコマンドやスクリプト ### yarnコマンド `yarn install`:普段私たちがRailsでの開発で使うbundle installと同じようなイメージ。パッケージ間の依存関係を考慮してインストールしてくれる。 `yarn add <PACKAGE_NAME>` : 指定したパッケージをインストール `yarn remove <PACKAGE_NAME>` : 指定したパッケージをアンインストール `yarn upgrade <PACKAGE_NAME>` : 指定したパッケージを最新バージョンに更新する (※ package.jsonの範囲を超えて最新安定バージョンをインストールするときは`--latest`オプションをつける) `yarn upgrade-interactive[--latest]` : 全てのインストールしてあるパッケージの更新情報をチェック、対話形式で一括アップデートできるコマンド `yarn info <PACKAGE_NAME>` : 指定したパッケージについての情報を表示 ちなみに、`yarn add`や`yarn remove`と同等の操作は、package.jsonファイルのdependenciesエントリを直接編集することも一応可能。 ##### yarn.lockでご安全に パッケージのバージョンを管理してくれているので、日々更新されるバージョン環境に左右されない。きっと消してはいけないファイル(npmコマンドを使った場合`package-lock.json`) ### Reactの魔法 react-scripts **ejectは不可逆コマンドなので、要注意**!!! >Facebook帝国の庇護の下にいる方が無難 ejectを使わないでパッケージ(react-app-rewiredやCRACOなど)を使ってwebpackなどを部分的に書き換えられるよ。 長い物には巻かれようね❤︎ ## 参照 パスカルケースとは https://wa3.i-3-i.info/word13955.html yarn upgrade-interactiveについて https://qiita.com/terrierscript/items/98931b91d155348046c9 # 2021年9月3日 ### What is JavaScript? - 第一級関数とオブジェクト指向をサポートしたブラウザで動く言語をつくろうとして生み出されたのが**JavaScript** - 当時流行していた**Java**に構文と名前を似せた。 - JavaとJavaScriptは違うよ(タイと台湾、インドとインドネシアくらい違う) - TypeScriptはJavaScript(関数型言語)の上位互換の言語 - **世界的にはJavaScriptは再評価されてきている!!**(日本がんばれ) - リテラルとは ```javascript= const hoge = "Hello" ``` 値のこと。上記コードで言えば、Helloがリテラル(文字リテラル) 変数の中にある値を示す。 >オブジェクトはプロパティの集合です。プロパティとは名前(キー)と値(バリュー)が対になったものです。 プロパティのキーには文字列またはSymbolが利用でき、値には任意のデータを指定できます。 また、1つのオブジェクトは複数のプロパティを持てるため、1つのオブジェクトで多種多様な値を表現できます。 第一級関数とは? 関数がその他の変数と同様に扱われる。 https://jsprimer.net/basic/function-declaration/#first-class-function ```javascript= // 関数の定義の仕方① function func1(str) { return str; } console.log(func1("これはfunc1です")); // => "これはfunc1です" ============================== // 関数の定義の仕方② 変数の中に関数を入れることもできる const func2 = function(str) { return str; } console.log(func2("これはfuc2です")); // => "これはfunc2です" ============================= // 関数の定義の仕方③ アロー関数  const func3 = (str) => { return str; } console.log(func3("これはfunc3です")) // => "これはfunc3です" // 関数の定義の仕方④ 省略したアロー関数 const func3 = (str) => str; console.log(func3("これはfunc3です")) // => "これはfunc3です" ``` - JavaScriptの標準仕様のことをECMAScriptといい、2021年の最新版はES2020 - ES5とES6(ES2015)で大きく仕様が変わった。(もはや別の言語レベル) - JavaScriptは後方互換性を重視した言語であり、バージョンが変わることによるエラーはほぼ無い - ECMAScriptはバージョンではなくて、「**仕様**」(エディション)の名称。 ## 2-2 変数の宣言 **varは今後二度と使ってはいけません!!!!** 変数はconstとletで定義しましょう!! できればletもあまり使わない様にしましょう! ![](https://i.imgur.com/gJ27vTF.png) 変数を宣言する前に変数に代入して使用することを「巻き上げ」といい、他の言語ではあまり見られない仕様で、よくない。 ```javascript= # constを使った良い例 const a = 100; console.log(a); ``` > **paiza.ioは話半分よりちょい上くらいの感覚で試してください 実際のコンソールでの挙動と若干違う時があります** 以下はTypeScriptでの例 `const` ![](https://i.imgur.com/admXZVH.png)<br> `let` ![](https://i.imgur.com/ltSZpMe.png)<br> `var` ![](https://i.imgur.com/E5F2gsW.png)<br> `var`を書かない ![](https://i.imgur.com/0nIsYrW.png) ## 2-3 JavaScriptのデータ型 ## 型とは オブジェクトは全て型を持っていることを踏まえた上で考える。 **静的型付け**の場合は、データ型を先に宣言してから変数を定義して、値を代入する。そして、宣言した型以外の代入は**認めない**。(TypeScriptは**静的型付け言語**)   <br> - JavaScriptはRubyらと同じ**動的型付け言語**なので型が変わる ![](https://i.imgur.com/D02Mmwm.png) - TypeScriptは静的型付けなのでエラーが出る ![](https://i.imgur.com/VzvHTOh.png) JavaScriptのデータ型は**プリミティブ型**と**オブジェクト型**に大別され、プリミティブ型はさらに7種類に分類される。 プリミティブ型はそれ自体はオブジェクトではないので、インスタンスメソッドが存在しない。 ### ①Boolean型 trueもしくはfalse。真偽を表す値。 ### ②Number型 整数も少数も含めた全ての数字。最大9千兆。 ### ③BigInt型 Number型よりも大きな値。Numberとの互換性はない。 ※ 扱える環境が限定的だからあまり活用できる場面がない。 ### ④String型 文字列 ### ⑤Symbol型 固有の識別子を表現する際に用いる。プロパティキーとして仕様が可能。 ※ JSONでのパースができないのであまり活用できる場面がない。 ### ⑥Null型 データが存在しない状態を明示している。 ### ⑦Undefined型 宣言のみが行われた変数や、存在しないプロパティを参照した際の型 ### プリミティブ型とオブジェクト型 - プリミティブ型 - 一般的な文字の型(数字とか、文字とか) - 一度作成したらその値を変更することができない - オブジェクト型 - 配列とか正規表現とか。。 - 一度作成した後も、その値自体を変更することができる ### ターミナルでTypeScriptを試す場合(REPLモード) ```sql= ts-node -v ``` で現環境にTypeScriptが入っているか確認します。 もし、入っていなかったら、 ```sql= npm install -g typescript ts-node ``` で現環境にTypeScriptを導入しましょう。-vで確認が取れた段階で ```sql= ts-node -- <--こいつレプル! ``` をターミナルで入力するとTypeScript用のコンソールを開くことができます。 ### truthyとfalsy falsyとして定義された値 (つまり、false, 0, -0, 0n, "", null, undefined, NaN(Not a Number)) を除くすべての値はtruthyです。 `parseInt()` : 文字列を整数に変換する関数 ## 参照 オブジェクト - JavaScript Primer https://jsprimer.net/basic/object プリミティブ型について https://wa3.i-3-i.info/word15876.html プリミティブ型とオブジェクト型の違い https://qiita.com/ta1fukumoto/items/effaa42cd296a2648d41 truthyとfalsyについて https://developer.mozilla.org/ja/docs/Glossary/Truthy --- # 2021年9月7日 ### プリミティブ値のリテラルとラッパーオブジェクト JavaScriptではプリミティブ値を定義するときに**リテラル**を用います。 リテラルとは、英語で「文字通り」を意味し、コードに書いた値がそのまま実行時にもその値のまま意味をもちます。(型定義せずに値の意味を持つ??) 各プリミティブ型に用意されているリテラル - Boolean型 - 真偽値リテラル(true、false) - Number型 - 数値リテラル - 浮動小数点リテラル(`2.1e8 = 2.1 × 10の8乗`) - BigInt型 - 数値リテラル(`100n`は小数点以下を四捨五入する) - String型 - シングルクォオートなどで囲む文字列リテラル - バッククォートで囲むと改行や式展開(`${}`)ができるテンプレートリテラル - Null型 - nullリテラル(nullを返す) JavaScriptではプリミティブ値にアクセスする時に、対応する**ラッパーオブジェクト**に自動的に変換される。 ```javascript= 'Serval lives in savanna'.replace('savanna', 'jungle'); 'Serval lives in jungle' ``` 内部でオブジェクトに変換されることにより、プリミティブ型で記述してもメソッドが使用できる。 今回で言えば、'Serval lives in savanna'がプリミティブ型のString型であることを自動判定し、対応するラッパーオブジェクト(rubyのオブジェクトと一緒?)のstringに変換している。 ```javascript= 'Serval lives in savanna'.replace('savanna', 'jungle'); // 内部で下記に変換されている。 (new String('Serval lives in savanna')).replace('savanna', 'jungle'); ``` インスタンスメソッドはオブジェクト型でしか使用できない。しかし、ラッパーオブジェクトにより、プリミティブ型をオブジェクト型に変換しているので、インスタンスメソッドが使用できるようになっている。 この変換はJavaScriptが毎回自動的にやってくれるので、普段私たちは意識せずに使用することができる。 |ラッパーオブジェクト|プリミティブ型|例| |--|--|--| |Boolean|真偽値|`true`や`false`| |Number|数値|1や2| |String|文字列|`"文字列"`| |Symbol|シンボル|Symbol("説明")| # 🤔🤔🤔🤔🤔🤔?????😧😧😧😧😧😧😧😧😧😧😧😧 三浦さんリテラルの言い方かわいい ### オブジェクト型とそのリテラル リテラルを持つオブジェクト型 - 配列リテラル - オブジェクトリテラル - 正規表現リテラル ### リテラルとは 変数に代入される値のことをリテラルと言います。 そのリテラルの型によって配列リテラルなのか、オブジェクトリテラルなのか、正規表現リテラルなのかが判断されます。 ```javascript= const hoge = "fuga" // ↑変数か関数 ↑文字列と認識してるから文字列リテラル const arr = [1, 2, 3] // ↑配列のリテラル ``` <br> JavaScriptでは、**限定的な場面**で用いる「オブジェクト」と、**広い範囲の意味**で用いる「オブジェクト」2種類ある。 ①限定的な場面での「オブジェクト」は、キーと値の組み合わせを持つプロパティの集合のことを指す。Rubyでいうハッシュなどもこれに該当する。 プロパティの集合(オブジェクト)は一般的に**JSON**形式で表したり、用いることが多い。そもそもJSONとはJavaScriptObjectNotation(JavaScriptオブジェクト表記法)の略なので、プロパティの集合がオブジェクトということにも納得がいく。 ↓ **JSONさんは「JavaScriptオブジェクト表記法」の略** ②広義のオブジェクトはプリミティブ値以外の全ての値を指す。 もっと細くいうと、最終的な標準組み込みオブジェクト(継承元)として**Object**をもっている値。 コンストラクターって何? **オブジェクトを生成する関数** **newを呼び出す関数がコンストラクタ関数** コンストラクターは、インスタンス化された特定のクラスオブジェクトに属しています。コンストラクターは、そのオブジェクトを初期化し、オブジェクトの非公開の情報にアクセスできるようにします。コンストラクターの概念は、ほとんどのオブジェクト指向プログラミング言語にあります。本質的に、JavaScript のコンストラクターはクラスのインスタンスで宣言します。 # 文脈で察しろ 🥶 こういう配列の書き方をしたらこういうリテラルになる >""で囲えば文字列だよね ↑ 文字列を文字列として使えることをリテラル リテラルとは、プログラミングにおいてソースコード中で使用される、数値や文字列等の直に示したデータのことです。  より厳密に説明すると、プログラム中で常に同じ値をとる定数というものがありますが、定数が指す値のことをリテラルと呼びます。定数は変数のように識別子にデータ、値を代入したものです。例えば、以下のように定義したとします。 `const int A=10;` この場合、Aは定数であり、それだけ 指す値10がリテラルです。 ### ひとこと むずい ## 参照 【JavaScript】 コンストラクターとは?関数とは違うのか? https://note.affi-sapo-sv.com/js-constructor.php # 2021年9月16日 2-4.関数の定義〜 ### プログラミングにおける「文」と「式」の違い 文(Statement)・・・手続きを処理に命令するもの 式(Experession)・・・評価された後に値として存在するもの 例えば、ifは文(命令するもの)であり式ではない。 似たような使い方でも三項演算子は式(評価された値)であって、文ではない。 ```javascript= // 関数宣言文(文で定義する関数) function double(e){ return*2; } // 関数式(式で定義する関数) const twice = function(n){ return*2; }; ``` 関数宣言文、セミコロンいらない。 関数式、セミコロンいる。 JavaScriptにおける関数式は関数式はFunctionオブジェクトである。 なので、引数として渡したり、変数として代入できたりできる。 >TypeScriptを書くとVScodeで、その変数にマウスホバーすると参照元が分かるので、やってはいけない事が分かりやすい。 > JavaScriptではオブジェクトのプロパティ値に関数を設定できる。 プロパティ値に設定した関数のことを「**メソッド**」という。 ```javascript= const foo = { bar: 'bar', // bazがメソッド。(オブジェクトのプロパティ) baz: function() { console.log('I am `baz` method') }, }; ``` JavaScriptでは単なるオブジェクトのプロパティであってそれ以上の意味を持たない。 >自分たちはRubyを触ってきたので"メソッド"という言葉は同じでもJSでは異なる意味を持つので注意 ```javascript= // Function インスタンスの生成 const sum = new Function('n', 'm', 'return n + m;'); // 関数式(=関数リテラル) const add = function (n, m) { return n + m; }; ``` Functionコンストラクターを直接呼び出してインスタンスを生成すると、常にグローバルスコープで実行されるので危険!!! [MDN: Function() コンストラクター](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Function/Function) # 2021年9月24日 p70〜 ### アロー関数式と無名関数 関数宣言(functionを使う書き方)と関数式で名前付きで定義した関数は最初から関数に名前がついている。 無名関数の書き方 ```javascript= //function記法 (function(){}).name //アロー関数記法 (()=>{}).name ``` 無名関数はメモリに残らず、変数に代入したりしなければ定義した瞬間に消滅する。 Reactは関数型プログラミング。(宣言型プログラミング) 宣言型プログラミングとは同じ値に対して同じ処理を常に返してくれる関数の性質を組み合わせたプログラミング手法 ### さまざまな引数の表現 引数にはデフォルト値を持たせることができ、デフォルト値を設定した引数は呼び出し時に省略することができる。 ```javascript= const raise=(n, m=2)=>n**m; console.log(raise(3)); //9 ``` Rest Parameters:最後の引数の名前に`...`をつけることで残りの引数を配列として受け取ることができる(可変長引数) ```javascript= const ary4 = [10,20]; const ary5 = [30,40]; const ary6 = [...ary4]; console.log(ary6); => [10, 20] const ary7 = [...ary4, ...ary5]; console.log(ary7); => [10, 20, 30, 40] ``` ## 2-5 ### クラスのようでクラスでない、JavaScriptのクラス構文 厳密にはJavaScriptsにはクラスという概念は存在しない。あくまでクラスっぽい挙動をする構文。 JavaScriptにおける**メンバーメソッド**とはRubyでいうインスタンスメソッド。 **staticメソッド**はRubyでいうクラスメソッド ```javascript= class Bird { static explain = (name){ console.log(`${name}は翼があって卵を産みます。`) } } ``` ### プロトタイプベースのオブジェクト指向とは **クラス**・・・実体を持たない概念 **プロトタイプ**・・・実体を持つオブジェクト インスタンスを生成するための**コンストラクタ関数**とは、プロトタイプオブジェクトを継承して、新しいオブジェクトインスタンスを生成する関数 **JavaScriptではあらゆるオブジェクトは何らかのプロトタイプを継承している。** プロトタイプベース 参考文献: staticメソッド(クラスメソッド)について https://www.bold.ne.jp/engineer-club/java-static-method # 2021年9月30日 p83〜 ## 2-6 配列やオブジェクトの便利な構文 ### 分割代入とスプレッド構文 ```yarn add use-postal-jp``` でuse-postal-jpをインストールすることでnode_modules配下にuse-postal-jpが置かれる。 以下のように記述することで、usePostalJpが使えるようになる。 ```typescript= import { usePostalJp } from 'use-postal-jp' ``` usePostalJpの中身 ```typescript= export declare const usePostalJp: () => { response: AxiosResponse<{}> | null; address: Address; error: Error | null; pending: boolean; sanitizedCode: string; setPostalCode: import("react").Dispatch<import("react").SetStateAction<string | number>>; }; export {}; ``` 分割代入の使用例 ```typescript= const { address, setPostalCode } = usePostalJp() ``` usePostalJpの中から使用するプロパティを抜き取っている。 ### オブジェクトのマージとコピー シャローコピーとは・・・コピーされる階層が一段階のコピー # 2021年10月7日 p90〜 ## 式と演算子で短く書く OR演算子 || は左辺がfalsyな場合に右辺を評価する。 AND演算子 && は左辺がtruthyな場合に右辺を評価する。 NaN = not a number ![](https://i.imgur.com/bcxUrh1.png) [参考記事](https://qiita.com/phi/items/723aa59851b0716a87e3) ### Nulish CoalescingとOptional Chaining プロパティを繋いで評価するとき(user.nameなど)にレシーバーの部分がundefinedでもエラーを起こさずに、undefined で評価する。この記法のことをOptional chainingという。 [for...ofの参考](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/for...of) ブロック変数にしてる! なりっしゅこぁれぃしんぐ おぷしょなるちぇぃにんぐ ## 2-8 ### JavaScriptのthisとは何なのか ```javascript= const Person = function (name) { this.name = name; return this; }; const kanae=Person.call({gender:'f'},'Kanae'); //{gender:'f'}をthisとして渡す console.log(kanae); //{gender ``` <iframe src="https://paiza.io/projects/e/Bps3YHwGeyDHAH69PfEG7w?theme=ambiance" width="100%" height="500" scrolling="no" seamless="seamless"></iframe> ### thisの中身4つのパターン thisは呼ぶ場所で変わる。 関数の中なのか、、、、 実行する場所で行き先が変わるンゴ > 「どこでもドアー、うぇ〜い🎉」 callメソッドとか使うのかとか(第一引数が自ずとthisになるやつな) rails7=Vue ### thisの挙動の問題点と対処法 JavaScriptにおけるthisは呼ばれる場所(コンテキスト)で意味(中身)が変わる、**グローバル変数** ```javascript= class Person{ constructor(name){ this.name = name; } // ↓ の()の中にthisが入る 見えないだけ。 greet2(){ console.log(`Hello,${this.name}`) } } const creamy = new Person('Mami'); creamy.greet2(); ``` ## モジュールを読み込む ### もじゅーるの歴史 - **2009年**にNode.jsが登場し、CommonJS形式のおかげでrequire構文が使えるようになった。 - JSerとはJavaScriptを愛する開発者のこと - Node.jsで動くのがCommmon.js? - JavaScript初のモジュールバンドラ「Browserify」が**2011年**に登場した。 - 半年後にRequireJSが登場 - が、そんなに流行らなかった。 - そんな中、来るべき**2015年**JS大変革の年にECMAScript公式でES Modulesが発表された!!! - ES Modulesは標準で全てのブラウザに対応している - **2017年**にwebpackが登場 - webpackはネイティブでES Modulesをサポートしている - ESM以外にも、commonJS,AMDなど様々なモジュール構文に対応している!!最強!! - しかも、自動で構文を検知してくれるので、様々な構文が混在していてもOK!! ### webpack - webpackがサポートしているBabel LoaderでJS、JSX、TSなどをコンパイルしてバンドルしてくれる。 - webpackが提供しているモジュールバンドラ(Babel)の仕組みは、様々なメリットがあるので、仕組み自体がなくなることはないであろう。 - バンドルする方が、コードをブラウザでネイティブに実行するより、パフォーマンスも良い。 Webpack使いづらいとか言ってごめんなさい V8とNitroすご〜い みんなwebpackに感謝しよう ## ES Modulesの使い方 - 定義しておいた変数や関数をまとめて後でexportすることもできるし、定義と同時にexportすることもできる。 - デフォルトexportした変数や関数は、importする時に任意の名前をつけることができる。 - asを使うことで名前をつけることができる。 - node_modulesの配下は最初からパスが通っているので、パス指定する必要がない。 - ### 命令型プログラミング - 手続き型プログラミング - オブジェクト指向プログラミング https://lodash.com/docs/4.17.15#range ### 宣言型プログラミング ? --- ### 関数型プログラミング ```javascript= const counter = () => { let count = 0; const increment = () => { return count += 1; }; return increment; }; $ node > .load closure-counter.js > const increment = counter(); > count Uncaught ReferenceError: count is not defined > increment(); //←のincrementはnode前のと違う? 1 > increment(); 2 ``` ```javascript= const counter = () => { let count = 0; const increment = () => { return count += 1; }; return increment; }; $ node > .load closure-counter.js > const hoge = counter(); > count Uncaught ReferenceError: count is not defined > hoge(); 1 > hoge(); 2 ``` ```javascript= const counter = () => { let count = 0; const increment = () => { return count += 1; }; return increment; }; const increment = counter(); console.log(increment()) console.log(increment()) console.log(increment()) console.log(increment()) console.log(increment()) 1 2 3 4 5 ```

    Import from clipboard

    Paste your markdown or webpage here...

    Advanced permission required

    Your current role can only read. Ask the system administrator to acquire write and comment permission.

    This team is disabled

    Sorry, this team is disabled. You can't edit this note.

    This note is locked

    Sorry, only owner can edit this note.

    Reach the limit

    Sorry, you've reached the max length this note can be.
    Please reduce the content or divide it to more notes, thank you!

    Import from Gist

    Import from Snippet

    or

    Export to Snippet

    Are you sure?

    Do you really want to delete this note?
    All users will lose their connection.

    Create a note from template

    Create a note from template

    Oops...
    This template has been removed or transferred.
    Upgrade
    All
    • All
    • Team
    No template.

    Create a template

    Upgrade

    Delete template

    Do you really want to delete this template?
    Turn this template into a regular note and keep its content, versions, and comments.

    This page need refresh

    You have an incompatible client version.
    Refresh to update.
    New version available!
    See releases notes here
    Refresh to enjoy new features.
    Your user state has changed.
    Refresh to load new user state.

    Sign in

    Forgot password

    or

    By clicking below, you agree to our terms of service.

    Sign in via Facebook Sign in via Twitter Sign in via GitHub Sign in via Dropbox Sign in with Wallet
    Wallet ( )
    Connect another wallet

    New to HackMD? Sign up

    Help

    • English
    • 中文
    • Français
    • Deutsch
    • 日本語
    • Español
    • Català
    • Ελληνικά
    • Português
    • italiano
    • Türkçe
    • Русский
    • Nederlands
    • hrvatski jezik
    • język polski
    • Українська
    • हिन्दी
    • svenska
    • Esperanto
    • dansk

    Documents

    Help & Tutorial

    How to use Book mode

    Slide Example

    API Docs

    Edit in VSCode

    Install browser extension

    Contacts

    Feedback

    Discord

    Send us email

    Resources

    Releases

    Pricing

    Blog

    Policy

    Terms

    Privacy

    Cheatsheet

    Syntax Example Reference
    # Header Header 基本排版
    - Unordered List
    • Unordered List
    1. Ordered List
    1. Ordered List
    - [ ] Todo List
    • Todo List
    > Blockquote
    Blockquote
    **Bold font** Bold font
    *Italics font* Italics font
    ~~Strikethrough~~ Strikethrough
    19^th^ 19th
    H~2~O H2O
    ++Inserted text++ Inserted text
    ==Marked text== Marked text
    [link text](https:// "title") Link
    ![image alt](https:// "title") Image
    `Code` Code 在筆記中貼入程式碼
    ```javascript
    var i = 0;
    ```
    var i = 0;
    :smile: :smile: Emoji list
    {%youtube youtube_id %} Externals
    $L^aT_eX$ LaTeX
    :::info
    This is a alert area.
    :::

    This is a alert area.

    Versions and GitHub Sync
    Get Full History Access

    • Edit version name
    • Delete

    revision author avatar     named on  

    More Less

    Note content is identical to the latest version.
    Compare
      Choose a version
      No search result
      Version not found
    Sign in to link this note to GitHub
    Learn more
    This note is not linked with GitHub
     

    Feedback

    Submission failed, please try again

    Thanks for your support.

    On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?

    Please give us some advice and help us improve HackMD.

     

    Thanks for your feedback

    Remove version name

    Do you want to remove this version name and description?

    Transfer ownership

    Transfer to
      Warning: is a public team. If you transfer note to this team, everyone on the web can find and read this note.

        Link with GitHub

        Please authorize HackMD on GitHub
        • Please sign in to GitHub and install the HackMD app on your GitHub repo.
        • HackMD links with GitHub through a GitHub App. You can choose which repo to install our App.
        Learn more  Sign in to GitHub

        Push the note to GitHub Push to GitHub Pull a file from GitHub

          Authorize again
         

        Choose which file to push to

        Select repo
        Refresh Authorize more repos
        Select branch
        Select file
        Select branch
        Choose version(s) to push
        • Save a new version and push
        • Choose from existing versions
        Include title and tags
        Available push count

        Pull from GitHub

         
        File from GitHub
        File from HackMD

        GitHub Link Settings

        File linked

        Linked by
        File path
        Last synced branch
        Available push count

        Danger Zone

        Unlink
        You will no longer receive notification when GitHub file changes after unlink.

        Syncing

        Push failed

        Push successfully