Usando a variável “nome” não funciona com um object JS

O comportamento pode ser visto neste pequeno trecho (execute-o como um script global):

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

O alerta rende undefined no Chrome, mas funciona no IE e no Firefox. Eu também tenho um valor estranho quando eu faço

 alert(name); 

    window.name tem uma finalidade especial e é suposto ser uma string. O Chrome parece explicitamente convertê-lo em uma string, então var name = {}; na verdade, acaba dando o name variável global (ou seja, window.name ) um valor de "[object Object]" . Como é uma propriedade primitiva, as propriedades ( name.FirstName ) não serão ” name.FirstName “.

    Para contornar este problema, não use o name como uma variável global.

    Sua variável de name é, na verdade, window.name , porque as variables ​​de nível superior declaradas com var são anexadas ao object global.

    A especificação HTML5 requer que window.name seja um DOMString . Isso significa que o valor de window.name só pode ser uma sequência de caracteres , não um object.

    No Chrome, uma tentativa de usar window.name para armazenar qualquer coisa, exceto uma string primitiva, forçará o valor a uma string primitiva. Por exemplo:

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

    Você pode evitar esse problema usando uma variável de name que não esteja no escopo de nível superior:

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

    window.name é usado para definir o nome da janela e, como o nome da janela pode ser apenas uma string, qualquer coisa definida como window.name é convertida em uma string. E seqüências de caracteres, como valores primitivos, não podem ter propriedades. A solução é usar um nome de variável diferente ou um escopo diferente.

    Alternativamente, você pode usar window.name como quiser se você tiver este código primeiro. Eu não recomendo isso, mas apenas como uma prova de conceito:

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

    Além disso, você deve usar {} no lugar do new Object . Além de ser mais conciso, também é mais eficiente e mais explícito.