JavaScript: The Definitive Guide, 7th Edition を読みながらメモ

JavaScriptの勉強をしたくて読んでる。英語なので時間がかかってるけど、良い本だと思う。

www.oreilly.com

以下、読んだところを読み直しながら何回かに分けて自分用にメモを残していこうと思う。

## Ch.2 Lexical Structure

return, break or continue のあとに式が続くときには改行を入れたらダメ。へー。

function sample() {
    return
    true;
}

console.log(sample());

これは return; true; と解釈されて undefined になる。

## Ch.3 Types, Values, and Variables

### 3.2 Numbers

  • Numberは64-bit floating-point format
  • 整数も小数も同じNumberで表されるってことっぽい。へー。
> typeof 4
'number'
> typeof 4.5
'number'
> .3 - .2
0.09999999999999998
> .2 -.1
0.1
  • (あとで調べる) 金額計算とかは特別なライブラリーとかを使うんかな?
  • 整数は ±253 − 1 の範囲で正確に表現できる
> Number.MIN_SAFE_INTEGER
-9007199254740991
> Number.MAX_SAFE_INTEGER
9007199254740991
  • だけど、中には32-bitの整数が使われる処理があることに注意(配列のインデックスとか)
  • 大きな整数を扱いたいときは BigInt (ES2020)を使う。64-bit整数が利用できる。リテラルn を末尾につける。普通の数値と混ぜて計算をすることはできない。だけど、比較は可能。
> typeof 1000n
'bigint'
> 100n + 200n
300n
> 100n + 200
Uncaught TypeError: Cannot mix BigInt and other types, use explicit conversions
> 100n > 99
true
> 100n == 100
true
> 100n === 100
false
  • NaN (not-a-number)はどの値ともイコールにならない。 NaN 自体ともイコールにならない。 NaN であることを確認するには Number.isNaN(x) を使う。
> let x = NaN
undefined
> x === NaN
false
> Number.isNaN(x)
true

### 3.3 Text

  • char型みたいなのはなくて全部string型
  • Immutable
  • UTF-16Unicode character set
  • stringはread-only arrayでもあることに注意
  • テンプレートリテラル(ES6)はbackticks(`)で。
> let name = "Bill"; `Hello ${ name }.`;
'Hello Bill.'
  • サロゲートペアの場合はlengthや配列のアクセスでは2文字として扱われる。でも、ES6では for/of ループや ... オペレーターを使うと、サロゲートペアの場合も1文字として扱われる
> let hokke = '𩸽'
undefined
> hokke.length
2
> hokke[0]
'�'
> hokke[1]
'�'
> [...hokke]
[ '𩸽' ]
> [...hokke][0]
'𩸽'

### 3.4 Boolean Values

  • 以下の6つの値は falsy values。falseに変換されて、falseのように振る舞う。それ以外はtrueに変換されて、trueのように振る舞うtruthy values。
undefined
null
0
-0
NaN
""

### 3. 8 Immutable Primitive Values and Mutable Object References

  • Primitive values (undefined, null, booleans, numbers, and strings) はimmutable。また、値で比較する。
  • Objectsはmutable。また、値ではなくて参照で比較する。

### 3.10 Variable Declaration and Assignment

  • const は定数だけに使う派と、基本的に const を使って必要なときだけ let を使う派があって、著者は前者派。へー。
  • letconstブロックスコープ

var について

  • var は新しくコードを書くときは使う必要がないけど、古いコードを読むときには出てくるかも。
  • varブロックスコープじゃない。深くネストされてたとしても定義された関数がスコープになる。
  • var が関数の外で使用されている場合は、グローバル変数になる。その場合、 letconst と違って glabalThis のプロパティになる。
> var x = 1
undefined
> globalThis.x
1
  • letconst と違って、var は同じ変数を複数回宣言することが可能。
  • var の宣言は "hoisting" される。 var で宣言された変数はその関数の一番上に持ち上げられる(hoisted)。

### 3.10.3 Destructuring Assignment

ES6のDestructuring Assignmentについて

> let [x, y] = [1, 2]
undefined
> x
1
> y
2
> [x, y] = [y, x]
[ 2, 1 ]

便利だなー

> let [x, ...y] = [1,2,3,4]
undefined
> x
1
> y
[ 2, 3, 4 ]

ホッケもいけるー

> let [first, ...rest] = "𩸽𩸽𩸽𩸽𩸽"
undefined
> first
'𩸽'
> rest
[ '𩸽', '𩸽', '𩸽', '𩸽' ]

オブジェクトも

> let transparent = {r: 0.0, g: 0.0, b: 0.0, a: 1.0};
undefined
> let {r,g,b} = transparent;
undefined
> r
0
> const {sin, cos, tan} = Math;
undefined
> sin
[Function: sin]
> cos
[Function: cos]
> tan
[Function: tan]

あれ?このペースでメモ書きしてたら全然終わらん。けど、ゆっくり覚えられるからいっか。また気が向いたら書こっと。