質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

7回答

2306閲覧

obj.toString === Object.toString がfalseになる理由

qwefrg

総合スコア17

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

1グッド

2クリップ

投稿2017/09/08 02:07

js

1var obj = {}; 2// 式1 3obj.__proto__.toString === Object.prototype.toString // => true 4// 式2 5obj.toString === Object.toString // => false

式2がfalseになるのはなぜでしょうか?
式2はまずobjにtoStringがあるかを探し、見つからなければ__proto__の中を探しに行くので、内部的には式1と同じことをやっているのだと考えていたのですが、そうではないようです
なぜこのようになるのか教えてください

Lhankor_Mhy👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答7

0

new Objectとできるように、Object自体は関数です。なので、Object.toStringFunction.prototype.toString(関数の中身を文字列化)を継承していて、Object.prototype.toStringとは別物です。

投稿2017/09/08 02:31

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

これらを実行してみてください。何が同じでなにが別物か解ると思います。

Javascript

1//toStringとは何者か? 2({}).toString === Object.prototype.toString 3//→ true イメージ通りだと思います。

Javascript

1//配列のtoStringとは何者か? 2[].toString === Array.prototype.toString 3//→true これもイメージ通りだと思います。

学んだ通りだと思います。
どんどん行きます。

Javascript

1//prototypeのtoString同士を比較してみます 2Object.prototype.toString === Array.prototype.toString 3//→false 文字列化の実装が違うのでfalseです。イメージ通りで大丈夫でしょうか?

Javascript

1//質問者さんが実体化したオブジェクトのtoStringを比較されていたので、 2//実体化したもの同士の比較も一応しておきます 3({}).toString === [].toString 4//→false 一つ上でfalseとなっているので当然ですよね

Javascript

1//ここからが本題。ではこれはどうなるでしょう? 2Object.toString === Array.toString 3//→true 4// おそらく質問者様のObject.toStringのイメージと違うと思います。

ここでObjectってなに?Arrayってなに?という疑問となります。

Javascript

1//Objectを直接叩いてみましょう。 2Object 3//→function Object()

Javascript

1//一応Arrayも叩いてみましょう。 2Array 3//→function Array()

functionが返ってきました。
Javascriptではfunctionもオブジェクトです。
ということは!?

Javascript

1Object.toString === Function.prototype.toString 2//→true

Javascript

1//となるので質問者さんは↓をやっていたという事になります。 2Object.prototype.toString === Function.prototype.toString 3//→false

投稿2017/09/08 03:58

so87

総合スコア764

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

qwefrg

2017/09/09 06:48

みなさま回答ありがとうございます!大変勉強になりましたし、私の疑問も解決しました!(想像以上に回答がついて個別にコメントするのが大変なのでこちらでまとめお礼言わせてください。) 今回は個人的にもっともわかりやすかったso87さんにベストアンサーを差し上げたいと思います!
guest

0

既に回答されている通りですが、誤解されているポイントは下記コードのような気がしました。

JavaScript

1obj.__proto__ === Object;

このコードは false を返しますが、「true を返す」と認識されていませんか。
その認識なら、下記コードが true を返すので、そういうことなのではと思いました。

JavaScript

1obj.toString === Object.toString // => false`

true を返すコードは下記になります。

JavaScript

1obj.__proto__ === Object.prototype;

従って、下記コードも true を返します。

JavaScript

1obj.toString === Object.prototype.toString;

Re: qwefrg さん

投稿2017/09/08 05:22

think49

総合スコア18164

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

1. obj.toString は何物か?

obj.toString は、Object.prototype.toString です。

obj.toString == Object.prototype.toString // true

2. Object.toString は何物か?

Object.toString は、Function.prototype.toString です。
Objectは関数オブジェクトだからです。

Object.toString == Function.prototype.toString // true

3. その2つは同じものか?

Object.prototype.toString と、Function.prototype.toString は別の関数です。

Object.prototype.toString == Function.prototype.toString // false

4. 結論

よって、obj.toString === Object.toStringfalseとなります。

投稿2017/09/08 04:37

ku__ra__ge

総合スコア4524

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

toStringがObjectのネイティブコードだからですかね
実行形式で記述すると戻り値がちがいますし

javascript

1var obj = {}; 2console.log(obj.toString()); 3console.log(Object.toString()); 4console.log(obj.__proto__.toString()); 5console.log(Object.prototype.toString());

普通に追加したユーザー関数だと同値になりますね

javascript

1Object.prototype.hoge=function(){return "fuga";}; 2var obj = {}; 3console.log(obj.hoge===Object.hoge); 4console.log(obj.__proto__.hoge===Object.prototype.hoge);

投稿2017/09/08 02:30

yambejp

総合スコア114839

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

javascript

1var obj = {}; 2 3 4// __proto__ と prototype は違うものです。 5Object.__proto__ === Object.prototype; // false 6 7// プロトタイプチェーンは __proto__ を経由して、コンストラクタの prototype をたどりますが、、、 8obj.toString === obj.__proto__.toString; // true 9obj.__proto__.toString === Object.prototype.toString; // true 10 11// 、、、そのオブジェクト自身の prototype はたどりません。 12Object.toString === Object.__proto__.toString; // true 13Object.__proto__.toString === Object.prototype.toString; // false 14 15 16 17//とはいえ、最終的には同じところにいくんですけどね。 18Object.__proto__.__proto__ === Object.prototype; // true 19

投稿2017/09/08 04:29

編集2017/09/08 05:29
Lhankor_Mhy

総合スコア36115

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

"var obj = {};" と定義されていますから、objはArrayクラスのオブジェクトです。
Arrayクラスには、toStringメソッドがありますから、__proto__の中を探しに行きません。

objは中身の無い(要素数0)の配列ですから、obj.toString()は、""を返すはずです。
(中身があれば、それぞれの要素の.toString()の値をカンマ区切りで列挙した文字列になる)

投稿2017/09/08 02:26

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2017/09/08 02:32

var obj = {};でできるものはObjectで、Arrayではありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問