4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【JavaScript】全ての値がオブジェクトに`なり得る`

Posted at

はじめに

開眼!JavaScriptを読んだまとめ的な記事です。

オブジェクト

「オブジェクトとは、名前と値を持つプロパティを格納するコンテナにすぎない」
著者も言っていますが、オブジェクトとはただのプロパティを持った箱です。
これ以上も以下もありません。

プリミティブ型

リテラルを使って値を生成したり、new演算子を使用せずにコンストラクタ関数で値を生成した際には、プリミティブ型となります。

// どちらもプリミティブ型
const myString = 1;
const myString2 = String('hello')

プリミティブ型はオブジェクトではありません。
ですが、プリミティブ型でもStringオブジェクトで使用できるメソッドを使用することができます。
何故でしょう。


// オブジェクトを生成
const myString = new String('hello');

console.log(myString.length);

// プリミティブ型を生成
const myString2 = 'hello';

console.log(myString2.length);

どちらも結果は「5」となります。

プリミティブ型の振る舞い

プリミティブ型はオブジェクトとして扱われません。オブジェクトのように扱われるまでは。

上の例で、プリミティブ型に対してlengthを使用した時が、プリミティブ型がオブジェクトのように扱われたタイミングです。

このタイミングで何が行われているのでしょう。


console.log(myString2.length);

ここが呼び出される前まではプリミティブ型として扱われています。
しかし、ここが呼び出されたタイミングで、このプリミティブ型をオブジェクトのように扱うために、JavaScriptがバックグラウンドで補完するラッパーオブジェクト(new String('hello')のような)を生成します。

つまり、下記の2つは同じ意味となります。


const myString = 'hello';
console.log(myString.length)

console.log((new String('hello')).length)

まとめ

つまり、JavaScriptは全ての値がオブジェクトということではありません。
タイトルの通り、JavaScript全ての値がオブジェクトのような振る舞いをするということです。

4
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?