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と同じことをやっているのだと考えていたのですが、そうではないようです
なぜこのようになるのか教えてください
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答7件
0
new Object
とできるように、Object
自体は関数です。なので、Object.toString
はFunction.prototype.toString
(関数の中身を文字列化)を継承していて、Object.prototype.toString
とは別物です。
投稿2017/09/08 02:31
総合スコア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
総合スコア764
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
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
総合スコア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.toString
はfalse
となります。
投稿2017/09/08 04:37
総合スコア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
総合スコア114843
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
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総合スコア36115
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
"var obj = {};" と定義されていますから、objはArrayクラスのオブジェクトです。
Arrayクラスには、toStringメソッドがありますから、__proto__の中を探しに行きません。
objは中身の無い(要素数0)の配列ですから、obj.toString()は、""を返すはずです。
(中身があれば、それぞれの要素の.toString()の値をカンマ区切りで列挙した文字列になる)
投稿2017/09/08 02:26
総合スコア6915
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。