開眼!JavaScript を読んでみた!

最近イメチェンをして襟足がなくなってしまったメガネです。

先日会社で隣に座っている社員さんから、JavaScriptの本を借りて読んでみたら、目から鱗だったのでざっくり感想を書いてみる。

最初に感想をいってしまうと、この本はJavaScriptの暗黙な部分を分かりやすく説明してくれてるなーって感じがしました。

1.javascriptは全てがオブジェクトではなかった!

javascriptで文字列を扱いたい場合は以下のような書き方があります。
Stringオブジェクト変数と文字列リテラル変数で動作の違いを検証したいと思います。

1
2
3
4
5
// Stringオブジェクト  
var str1 = new String("Hello World");

// 文字列リテラル
var str2 = "Hello World";

検証1. 変数の型を出力する

1
console.log(typeof str1);

出力結果:
object

1
console.log(typeof str2);

出力結果:
string

まぁ、ここまではなんとなく理解できる。

検証2. lengthメソッドを使って文字列の長さを取得する

1
console.log(str1.length);

出力結果:
11

これもオブジェクトのメソッドが使われてんだなーと、まぁわかる。

1
console.log(str2.length);

出力結果:
11

おや?あれ?str2はstringなのでプリミティブ型※1のはず。。。
length以外にもStringオブジェクトのメソッド全部使えちゃうけどなんでたー(?_?)

※1. プリミティブ型: 数字とか文字とかの基本的な値

以下サイトから引用

文字列リテラルのメソッド

文字列リテラルのメソッドを呼び出すと、一時的に文字列のラッパー オブジェクトに変換されます。 文字列リテラルは、その作成に new 演算子が使用されているかのように扱われます。

つまり、実行時にオブジェクトがつくられて、実行が終わったらオブジェクトは破棄されるってことなのかー。

javascriptは全てがオブジェクトではなく、オブジェクトのように振る舞うことができる言語なのね!!

2.プリミティブ型とオブジェクトの違い

比較
プリミティブ: 値を比較
オブジェクト: 参照を比較

1
2
3
4
var num1 = new Number(10);
var num2 = new Number(10);

console.log(num1 == num2);

出力結果:
false

1
2
3
4
5
6
var num1 = new Number(10);
var num2 = new Number(5);

num2 = num1;

console.log(num1 == num2);

出力結果:
true

値が違くてもオブジェクト型は参照を比較するので結果はtrueになる

3.所感

もっとjavascriptの本質に触れたい!という方は必読です。
本自体は薄いですが、かなり内容が濃くなっています。