34

この動作は、次の小さなスニペットで確認できます (グローバル スクリプトとして実行します)。

var name = {};
name.FirstName = 'Tom';
alert(name.FirstName);

アラートundefinedは Chrome で生成されますが、IE と Firefox で機能します。私も奇妙な値を取得します

alert(name);
4

4 に答える 4

41

window.nameには特別な目的があり、文字列である必要があります。Chrome は明示的に文字列にキャストしているように見えるため、実際にはグローバル変数(つまり) に の値をvar name = {};与えることになります。これはプリミティブであるため、プロパティ ( ) は「固執」しません。namewindow.name"[object Object]"name.FirstName

この問題を回避するにはname、グローバル変数として使用しないでください。

于 2012-05-09T21:04:07.110 に答える
1

window.nameウィンドウの名前を設定するために使用されます。ウィンドウ名は文字列しかできないため、設定したものwindow.nameはすべて文字列に変換されます。また、文字列はプリミティブ値であるため、プロパティを持つことはできません。解決策は、別の変数名または別のスコープを使用することです。

window.nameまたは、このコードを最初に持っていれば、好きなように使用できます。これはまったくお勧めしませんが、概念実証として:

(function () {
    var _name;
    window.__defineGetter__('name', function () {
        return _name;
    });
    window.__defineSetter__('name', function (v) {
        _name = v;
    });
})();

さらに、{}代わりに を使用する必要がありnew Objectます。より簡潔であるだけでなく、より効率的でより明確です。

于 2012-05-09T21:05:44.723 に答える