使用变量" name"没有使用JS对象

时间:2012-05-09 20:34:06

标签: javascript object window-object

可以在这个小片段中看到行为(将其作为全局脚本执行):

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

警报在Chrome中产生undefined但在IE和Firefox中有效。当我做

时,我也得到了一个奇怪的价值
alert(name);

4 个答案:

答案 0 :(得分:26)

window.name有一个特殊目的,应该是一个字符串。 Chrome似乎明确地将其转换为字符串,因此var name = {};实际上最终会将全局变量name(即window.name)赋予"[object Object]"的值。由于它是原始的,属性(name.FirstName)不会“坚持”。

要解决此问题,请不要将name用作全局变量。

答案 1 :(得分:7)

您的name变量实际上是window.name,因为使用var声明的顶级变量会附加到全局对象。

HTML5规范requires that window.name is a DOMString。这意味着window.name的值only be a sequence of characters可以{{3}},而不是对象。

在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);
})();

答案 2 :(得分:1)

使用ES6 +,您可以将代码编写为let nameconst name。这不会分配它,也不会尝试覆盖window.namehere的更多内容。

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

答案 3 :(得分: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。除了更简洁之外,它也更有效,更明确。