はじめに
エンジニアとして就職してから1年とちょっと経ちました。
その間ほとんどずっとRuby on RailsでのAPI開発しかして来なかったため、そろそろ他の言語も勉強してみようと思いJavaScriptを一から勉強します!
ちなみに現時点でのjs知識は
- 基本文法は何となく理解している
- ふわふわな知識でちょこっとちょっと触れるくらい
ご覧の通りちょっとした知識しかないため、まずはJavaScript Primerを全て読んでみたいと思います!
(ネットで無料で見れるのありがたすぎる... 製作者の方々、本当にありがとうございます)
第一部
変数と宣言
const
は再代入不可、let
は再代入可能、var
は使わない
基本はconst
で、次にlet
を使えば良さそう
同じスコープ内で変数の再宣言はできないっぽい
let a = 'a'; // undefined let a = 'aa'; //Uncaught SyntaxError: Identifier 'a' has already been declared
分割代入はこんな感じ
const [b, c] = ['b', 'c']; b // 'b' c // 'c' // 要素数が足りない場合はundefinedが入るっぽい const [e, f] = ['e']; e // 'e' f // undefined
値の評価と表示
変数宣言はundefined
を返す
Rubyだとselfの値が返ってくるのでちょっと違和感
そもそも変数に関数を入れれるのに『変数宣言』って呼んで良いのかは疑問
この辺りRubyと結構違いそうなので気をつける
データ型とリテラル
プリミティブ型とそれ以外のオブジェクト型
RubyでいうところのArrayもオブジェクト型
Ruby的にはクラスがメソッドを持っている感じだけど、jsではオブジェクトがプロパティを持っているという理解で合ってるのかな?
ここに関しては続きの章で解説があるらしいので一旦保留
演算子
基本的にはRubyと同じ感じ
ただこれでなんで2になるのかは分からない...
let num = +'2'; num // 2
Rubyみたいにオブジェクトに対してメソッドを呼ぶみたいな考え方じゃないのかも...
===
は比較、==
は暗黙的な型変換してからの比較
jsのfalseは
- false
- undefined
- null
- 0
- 0n
- NaN
- ""
数が多いよ...
||
演算子だとfalsyな値全てがfalse
として扱われてしまう
??
演算子を使えばnull
orundefined
のみfalse
として評価される
暗黙的な型変換
暗黙的な型変換が行われるのは分かったけど1 + true
が2
になるのは衝撃すぎる
基本的に暗黙的な型変換に頼るような実装はやめましょうみたいな理解でいいのかな?
関数と宣言
仮引数が渡されなかった場合はundefinedになって、多く渡した時は無視される
下の例だとnum2がundefinedになってnum1 * num2
の結果がNaNになる
const multiplication = (num1, num2) => { return num1 * num2; end multiplication(2,3) // => 6 multiplication(2) // => NaN multiplication(2,3,4)// => 6
Rubyと違ってエラーにならないのか〜
Rubyでいう可変長引数はこんな感じ
function fn(...args) { return args; } fn(1,2,3,4,5) // => [1, 2, 3, 4, 5] //////////////// function fn(num1, num2) { return num1 * num2; } fn(...[2,3]) // => 6
argments
という関数の中でのみ参照できる特殊な変数がある
function fn() { console.log(arguments); } fn(1, 2, 3) // => [Arguments] { '0': 1, '1': 2 }
Arrayっぽいけど実際はObjectの形で値が入ってるため、インデックスを使って値は取れるけどArrayのメソッドは使えないみたい
ただそもそもArrayもObject型なのに、Arrayのみで使えるメソッドが定義されてるってどういうこと??
この辺りからちょっと理解が難しい...
jsの関数は第一級関数と言って変数に代入できる
function double (num) { return num * 2; } const fn_1 = double; // ()付きで渡してないので関数が変数に代入される const fn_2 = double(5); // ()付きで渡してるので関数の戻り値が代入される
Arrow Functionの書き方で関数式を短く書ける
const fnA = (x) => { return x; }; const fnB = x => { return x; }; // 仮引数がひとつなら()を省略できる const fnC = x => x; // 一行のみの場合はブロックとreturnを省略できる x => x; // 無名関数だとこんな感じで書ける
引数として渡される関数の事をコールバック関数というのは何となく知ってた
オブジェクトのプロパティである関数をメソッドと呼ぶらしい
第一級関数で関数を値として扱えるからオブジェクトの値に関数を定義できるってことかな?
ここが全くRubyと違うのでびっくりした
const obj = { method: num => num }; obj.method(10) // => 10 // こういうい書き方もできる(推奨らしい) const obj = { method(num) { return num; } }
obj.hoge
でオブジェクトに新しくプロパティを追加できる
感想
やっぱりRubyとは全然違うなぁという感想
色々触ってみないと本質的なところが分からないと思うので、とりあえずJavaScript Primer終えたら違う本買ってみようと思います!
続きは後日