2012-05-09 3 views
14

では動作しません:変数「name」を使用すると、動作が(グローバル・スクリプトとして実行)この小さなスニペットで見ることができますJSオブジェクト

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

警告利回りChromeのundefinedが、作品IEとFirefoxで。また、私は

alert(name); 
+1

'language'属性は廃止され、唯一の' type'が属性を使用します。 'alert'の代わりに' console.log'を使い、Chrome Devを使うのも良いでしょう。それらを読むためのツール(またはFireBug)。そして最終的にコードの1行目にdoctypeを持つ必要があります。doctypeは '<!doctype html>' –

+2

です。AFAIK 'var name = {}'構文を使うのが一般的です。 – Hamish

+0

それはちょうどタイプミスでした...私はオブジェクトではない 'オブジェクト'を入力しました。それでもクロムにはエラーが発生します。 chromeで新しいコードを試してみてください。 –

答えて

17

window.nameを行う際に特別な目的を持っており、文字列のことになっている奇妙な値を取得します。 Chromeは文字列に明示的にキャストしているようです。したがって、は実際にはグローバル変数name(つまりwindow.name)の値に"[object Object]"という値を与えてしまいます。それはプリミティブなので、プロパティ(name.FirstName)は「スティック」しません。

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

+0

良いキャッチ...私は変数名にまったく注意を払っていませんでした。 –

+0

@FelixKling私はほとんどの予約語のように 'name'を扱います。なぜなら、いくつかのホストは' name'プロパティも関数に与えているからです(私はこれまでに噛まれています)。クロージャーはそれを細かくしません。 –

+0

私が覚えている限り、その問題のいくつかの質問をされている... –

0

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

また、このコードが最初にある場合は、window.nameを好きなように使用できます。私はコンセプトの証明として、すべてでこれをお勧めしますが、しません:

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

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

+0

またはちょうど '削除名前;' – Oriol

6

name変数は、varで宣言された最上位変数がグローバルオブジェクトに関連付けられているため、実際にはwindow.nameです。

HTML5仕様requires that window.name is a DOMStringです。つまり、window.nameの値はonly be a sequence of charactersであり、オブジェクトではありません。

Chromeでは、window.nameを使用してプリミティブ文字列以外のものを保存しようとすると、その値がプリミティブ文字列に変換されます。たとえば:

window.name = {}; 
window.name === "[object Object]"; // true 

あなたはトップレベルの範囲内にないname変数を使用することで、この問題を回避することができます

(function() { 
    var name = {}; 
    // this `name` is not `window.name` 
    // because we're not in the top-level scope 

    console.log(name); 
})(); 
関連する問題