2

console.log('' + {});コンソールのようなものをログに記録すると[Object object]、Chrome では出力されますが{}、ノードでは別のもの ( ) が出力されます。この時点で、コンソール出力は実行環境に依存すると思っていたでしょう。

しかし、最近、いくつかのnot-null objectが与えられた場合、上記の予想される出力の代わりfooに何らかの形で Chrome が印刷されることを発見しました。nullそのため、使用するとコンソールにconsole.log('' + foo);なりました。nullそんなことがあるものか?私が最初に推測したのは、何らかのtoString()メソッドなど、重要なものを誤ってオーバーライドしたに違いないということでした。そうしないと、Chrome が非 null オブジェクトをnull文字列に追加されたときに解釈する理由を説明できませんでした。

オブジェクトから文字列への暗黙的な変換が実際にどのように機能するかを知っている人はいますか? これがショーストッパーというわけではありませんが、本当に不思議に思います。

編集: JSFiddle は含まれていません。これは、依存関係が非常に多いクラスで発生するためです。そのため、提供できる適切な最小限の作業例はありません。とにかく、質問は私のコードを参照していません。それはかなり基本的で技術的なものです。

別の編集:完全を期すために、コメントに投稿したスクリーンショットを追加します。

4

2 に答える 2

1

最初のケースの違いは、異なる環境がコンソールでオブジェクトを文字列として表現する方法を選択することです。どちらも同じことを意味します。つまり、ログに記録しているものはオブジェクトです。Firefox または Safari の開発者ツールでテストした場合、さらに違いが見られる場合があります。

2番目の例では、の値fooがnullであると思われます-値が設定されていない場合、またはXymostechがコメントで述べているように、文字列に設定されている場合にステートメントconsole.log('' + foo)が出力される状況は考えられません.nullfoonullnull

于 2013-04-27T01:35:28.167 に答える
1

オブジェクトから文字列への変換について尋ねたので: Object.toString

文字列連結式でオブジェクトを使用すると、オブジェクトのtoString()関数が呼び出されます。説明した問題を引き起こす可能性のある独自の関数を実装できます。

function Foo(bar){
  this.bar = bar;
}
Foo.prototype.toString = function fooToString(){
    return this.bar;
};

console.log('' + new Foo(null)); // null

コードが表示されていない場合は、これであるか、実際には単なる String であると思います"null"。あなたはすでにtoString関数をチェックしたと言いましたが、実行時にfoo.toString.toSource(). または、デバッガーでオブジェクトを実行して検査します。

于 2013-04-27T02:23:54.187 に答える