全てのリテラルがオブジェクトのインスタンスとは限らない件について

オライリーの『javascript第5版』いわゆる「サイ本」を読んでいて、リテラルとオブジェクトの項目でいろいろと実験していく過程で、「ん?」と思う部分があったのでまとめてみました。

2013/3/7 ブログ移行により、新URLにリダイレクトしました。
リダイレクト元URL : https://blog.nzakr.com/2011/12/120101.html

javascriptのリテラルといっても、文字列、数値、オブジェクト、関数、配列、正規表現等々いろいろあるんですが、文字列の項目でひっかかりました。

【スポンサーリンク】

文字列リテラルでの挙動

文字列を変数に格納してみます。

var str = "hoge"; //"hoge"
var strObj = new String("fuga"); //"fuga"

だいたいのjavascriptの参考書籍には、文字列はStringオブジェクトで、どちらの記述も同じもの的なことが書いてあります。ちょっと踏み込んだ書籍だと、「javascriptではリテラルを対応する組み込みオブジェクトとして利用できる」みたいに書いてあったりします。
ですが、今回instanceof演算子の利用において、ちょっとした違いを発見しました。

var str = "hoge";
var strObj = new String("fuga");

console.log(str instanceof String); //false
console.log(strObj instanceof String); //true

同じであるはずのものなのに、instanceofでの結果が異なりました。new演算子でインスタンスを生成したものはtrueが返ってくるのに、文字列リテラルではfalseが返って来ました。

なぜだろう…

もしかすると、他のリテラル表記も同じかもしれないと思い、いろいろと調べてみました。

他のリテラルでの挙動

結果が異なったもの(false ⁄ true)

数値リテラル

var num = 10;
var numBbj = new Number(10);

console.log(num instanceof Number); //false
console.log(numBbj instanceof Number); //true

真偽値リテラル

var a = true;
var b = new Boolean(false);

console.log(a instanceof Boolean); //false
console.log(b instanceof Boolean); //true

結果が同じだったもの(true ⁄ true)

配列リテラル

var ary = [1,2,3];
var aryObj = new Array(1,2,3);

console.log(ary instanceof Array); //true
console.log(aryObj instanceof Array); //true

関数リテラル

var func = function(){};
function myFunc(){};

console.log(func instanceof Function); //true
console.log(myFunc instanceof Function); //true

正規表現リテラル

var a = /hoge/;
var b = new RegExp('hoge');

console.log(a instanceof RegExp); //true
console.log(b instanceof RegExp); //true

以上のように、数値、真偽値は文字列同様に結果が異なりました。一方、配列、関数、正規表現はどちらもtrueが返って来ました。

いろいろ調べてみると、どうやらリテラル表記のものは、メソッド利用の際、一時的に各オブジェクトに変換しているらしいです。つまり、永続的なオブジェクトのインスタンスではないので、falseが返って来たみたいです。
実際挙動が異なるものがあるみたいです。

var a = "2+2";
var b = new String("2+2");

console.log(eval(a)); //4
console.log(eval(b)); //String { 0="2", 1="+", 2="2"}

こんな感じでした。それぞれの変数をeval関数を通してみたのですが、newで宣言しているStringオブジェクトは返ってくる値がStringのままでした。

どんな機会これを使うのかは想像できないんですが、人に説明する際には、「”ほぼ”同じです。」と説明するのが無難かもしれません。

まあ正直なところ、ほとんど使いわける機会ないので、同じと説明していいと思う。

この記事についたタグ
この記事を書いた人
ねづ
『NEZU.log』運営管理者。Webエンジニアの傍ら、趣味でこのブログを運営。シェアハウス在住。2015年は海外情報(主にアジア圏)と効率のよい生活の情報発信がテーマ。
この記事が面白かったらいいねしよう!
記事のタイトルとURLをコピーするコピーしました!
こちらの記事もどうぞ
こちらの記事もどうぞ

コメントを残す

コメント※必須
名前※必須
メールアドレス※必須(非公開)

全てのリテラルがオブジェクトのインスタンスとは限らない件について
このブログを書いている人

運営者 : ねづ

主にWebの企画、開発の仕事をしています。
海外が好きで、仕事、旅行問わずよく行きます。
フィリピン(セブ)で10週間留学後、現在はカナダ(バンクーバー)に滞在。留学、海外生活や旅行記をこのブログで書いています。

詳しいプロフィールはこちら

LINE@作成しました!お気軽にどうぞ!
友達登録は下記QRコードを読み取ってください
LINE@ QRコード

カテゴリ一覧
キーワードで記事を探す
下記から更新情報を受け取れます!