10

ブラウザーまたは Node.js で次のコードを実行すると、コメントに記載されている期待される結果が得られます。

Object.prototype.toString.call(undefined); // "[object Undefined]"
Object.prototype.toString.call(null); // "[object Null]"

ただし、そのコードを PhantomJS で実行すると[object DOMWindow]、どちらの場合も出力されます。

undefinednullはどちらもネイティブ タイプであるため、これは奇妙に思えます。このtypeof演算子は、他の環境 (変わったものを含むtypeof null === "object") と同じように機能するように見えるため、PhantomJS には少なくとも未定義型の概念があるように見えます。

typeof undefined; // "undefined"

またObject.prototype.toString、ネイティブ コードが含まれていると主張しています。これは、Phantom 自体が実装を変更するために何もしていないことを示している可能性があります (そうであるかどうかはわかりませんが、ソースで有用なものを見つけることができませんでした)。 ):

Object.prototype.toString.toString(); // "function toString() { [native code] }"

では、PhantomJS がとの正しい[[Class]]プロパティ値を使用しない (または少なくとも公開しない) のはなぜですか?それを変更する方法はありますか? タイプを判別するために別の方法を使用できることはわかっていますが、そうする必要はありません。nullundefined

4

3 に答える 3

7

それは2つのものの組み合わせです。スクリプトは Web ページ内で実行されるため、window以下から明らかなように、グローバル オブジェクトはオブジェクトです。

console.log(this.toString()); // [object DOMWindow]

さらに、JavaScript 実装のそのバージョンには、上記の条件下でオブジェクト プロトタイプ チェーンを改ざんする問題があります。

これは、将来のバージョンで修正される可能性があります。

于 2013-01-10T02:16:26.037 に答える
0

ここにたどり着いたことは認めますが、言及に関するMDNの記事:Object.toString()

JavaScript 1.8.5 以降、null で呼び出された toString() は [object Null] を返し、undefined は [object Undefined] を返します。これは、ECMAScript の第 5 版とその後の Errata で定義されています。toString を使用したオブジェクト タイプの検出を参照してください。

リンクされたセクションでは、Object.prototype.toString(null)使用している構成について説明します。したがって、賢明に文字列化できるように見え、PhantomJSエンジン(AppleのJavaScriptCore、どのバージョンを知っnullundefinedいるか)がまだ実装していないJavascriptへの新しい(-っぽい)追加/修正です。とはいえ、これは Safari 6 で正しく機能するため、これをバグとして報告し、ES5 への準拠を求める価値があるかもしれません。

于 2013-01-10T02:33:46.547 に答える
-1

その2つのタイプだけであれば、問題をこれで囲むことができると思います。

Object.prototype.toString = function(obj){

    if(typeof(obj) == "undefined"){
        return "[object Undefined]";
    }

    if(typeof(obj) == "null"){
        return "[object Null]";
    }

    return obj.toString();

}
于 2013-01-09T02:56:38.383 に答える