「パーフェクトJavaScript」メモ 3章 Javascriptの型

3章は「型」。jsでは値とオブジェクトには型はあるが変数には型はない。

基本型(オブジェクト型以外の型)のインスタンスを値と呼ぶ(本書では)

オブジェクト型のインスタンスをオブジェクトと呼ぶ(本書では) 

インスタンス」という語が整理できていなかった。ググったら「実体」だそうだ。「クラス」がシニフィアンで「インスタンス」がシニフィエというところか(遅れてきたニューアカか)。

にしても、インスタンスという言葉はもっと限定的な使われ方をしていたような気がするが果たして。

 

JAVAのように変数に型のある言語を静的型言語、jsのように変数に型のない言語を動的型言語と呼ぶ 

 変数の型をユーザーが定義するのがクラスベース、型を定義する構文がなく振る舞い方に型があるだけというのがプロトタイプベース 

 「プロトタイプ」は最初の模型というイメージか。この辺の用語はコミュニケーションのためということで覚えておきたい。

 

基本型と参照型の説明、詳細は二学期

 

jsの数値型は1種類。実行効率よりもプログラミングの手軽さを重視したため

 数値型がJAVAのように複数あるとなぜ実行効率が上がるのかは知らないまま、とりあえず生きてゆく

(小数の可能性も考えつつ操作するのと、整数だと割り切って操作するのでは後者の方が速い、という印象はある)

 

jsにおいて「型変換」は落とし穴になる

 とりあえず額面だけ覚えておく

 

jsにおいて、文字列リテラルを囲む"と'には違いはない

PHPでは違うな

 

s2 に s を代入した場合 s の変更が s2 に見えるかどうかというと、jsでは見えない

その方がありがたい。過去を追いかけなくてすむ

 

typeof(x) で返ってくる結果を typeof する― typeof(typeof(x)) ―と、文字列値が返ってくる 

ものには型があるんだ

 

js の文字列値は大小比較演算が可能

 知らなかった。。。でも実際は英単語の頭文字くらいにしか使えないだろうということで

 

3-3-4 文字列クラス(Stringクラス) 

この節はかなり感動的(1000文字足らずだが)。x.lengthで長さをはかれるのは x がStringオブジェクトだからか。前章でやったようにオブジェクトはプロパティの集合で、プロパティとしてlength情報を持っている。いっぽう文字列値にはlength情報はないため、暗黙に文字列値から文字列オブジェクトへの型変換が行われている。

 

==と===の違い

内容が同じであれば型が違ってもtrueになるのが==、型が違えばfalseになるのが===

この字面だけだと理解していたが、その周辺を知って理解が深まった感がある。

 

「メソッド呼び出し」という言葉があまりピンときていない。x.length とか x.toString() とかそういう操作っぽいことをするのをメソッド呼び出しということでいいか。

method って「方法」と訳しているから「操作」とはなんとなく思いにくい。でもまあプログラミングでは操作と思っておいた方がよいのだろう。

ともあれメソッドによる操作はオブジェクトに対して行うのであって、文字列値、数値に対して行うのではない(文字列値、数値に対してメソッド呼び出しをした場合、その場でオブジェクトに型変換される)。

 

new String([value]) の効果を「Stringインスタンスを生成」と言っている部分(p48)と「文字列オブジェクトを生成」と言っている部分(p45)がある。どっちも同じことか。「オブジェクトの中味を生成」と言うか「オブジェクトを生成」と言うかの違いかな。

 

(p48) String.prototypeオブジェクトのプロパティをまとめてくれているが、それがなんなのかわからない。

 

 Stringクラスには破壊的なメソッドがないが、Arrayクラスには破壊的なメソッドが多くある

うん。怖いのでいつも新しい変数を用意してしまう。駄目か。

 

数値リテラル .14 は 0.14 と等価数

むしろエラーを返してほしい気がする。

 

NaN は数値、数値オブジェクトになれないものを数値に型変換しようとした場合に成り果てるもの(Not a Number)。詳細は二学期

そうだったのか。「なんか知らんがエラー」と思っていた。平和ボケでしょう

 

>Number.MAX_VALUE.toString(16)
"fffffffffffff800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"

すべてがfにな らないのか。

 

Number.MIN_VALUE.toString(16)
"0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004"

4ってなんだ

 

Number.POSITIVE_INFINITY という特別値もある

へえ。

 

NaN は NaN 同士の同値判定ですら偽になる

うわ。

 

そこでisNaNがある

よかった。

 

null値の本来的な意味は「何も参照していない」状態

null値の typeof演算の結果は "object"

 

undefined値はリテラル値ではなく定義済のグローバル変数

明示的に値を代入していない変数の初期値に過ぎない。

自分が要約した文字列をblockquoteで囲むのあまりよろしくない気がしてきた。けどラクなので続ける。

 

null値とundefine値を==で比較すると真になる

真になーるんS.O.S。真になーるんS.O.S。

 

jsでは暗黙の型変換に気をつけよう

はい

 

型変換のイディオムがいろいろある。

n+''  //数値から文字列値への型変換

+s //文字列力数値への型変換

!!s //なにかしらからブーリン型への型変換

 

・オブジェクトの中に「使えるメソッド」が既に入っている。(入ってないメソッドは使えない?)

「オブジェクトがメソッドを持つ」と言えるのは、そういうことでしょうか。すごい初歩的ではないでしょうかこれ。

 

3章終わり。