Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

The behaviour can be seen in this little snippet (execute it as a global script):

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

The alert yields undefined in Chrome but works in IE and Firefox. I also get a weird value when I do

alert(name);
                language attribute is deprecated, use only the type attribute. It's also better to use console.log instead of the alert and use the Chrome Dev. Tools (or FireBug) to read them. And finaly you need to have a doctype on line 1 of your code, a doctype is: <!doctype html>
– Wouter J
                May 9, 2012 at 20:37
                It was just typo ... I entered 'Object' not object. it still throws error in chrome. try the new code in chrome.
– Pialy Tapaswi
                May 9, 2012 at 20:56
                window.name is a special global variable in browsers. See developer.mozilla.org/en-US/docs/Web/API/Window.name it assumes the type is a string. If you use typeof to check nString, it is an object. You can run it in a nodejs console and the results is correct then. So it is not a javascript problem.
– Chris Li
                Jan 28, 2014 at 3:03

window.name has a special purpose, and is supposed to be a string. Chrome seems to explicitly cast it to a string, so var name = {}; actually ends up giving the global variable name (i.e. window.name) a value of "[object Object]". Since it's a primitive, properties (name.FirstName) won't "stick."

To get around this issue, don't use name as a global variable.

@FelixKling I almost treat name like a reserved word, since some hosts give functions a name property also (I've been bitten by that before), closure won't minify it, etc. – Dagg Nabbit May 9, 2012 at 21:24 Yeah, there have been a couple of questions with that problem as far as I can remember... – Felix Kling May 9, 2012 at 21:34

Your name variable is actually window.name, because top-level variables declared with var are attached to the global object.

The HTML5 spec requires that window.name is a DOMString. This means that the value of window.name can only be a sequence of characters, not an object.

In Chrome, an attempt to use window.name to store anything except a primitive string will coerce the value to a primitive string. For example:

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

You can avoid this problem by using a name variable that is not in the top-level scope:

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

window.name is used to set the name of the window, and since the window name can only be a string, anything you set to window.name is converted to a string. And strings, as primitive values, cannot have properties. The solution is to use a different variable name or a different scope.

Alternatively, you can use window.name as you like if you have this code first. I don't recommend this at all, but, just as a proof of concept:

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

Additionally, you should use {} in place of new Object. Besides being more concise, it is also more efficient and more explicit.

Note that __defineGetter__ and __defineSetter__ are both deprecated. Use defineProperty instead. – Sebastian Simon Oct 20, 2021 at 17:52

Thanks for contributing an answer to Stack Overflow!

  • Please be sure to answer the question. Provide details and share your research!

But avoid

  • Asking for help, clarification, or responding to other answers.
  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.