使用变量“name”不适用于 JS 对象

IT技术 javascript object window-object
2021-01-23 00:07:40

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

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

警报undefined在 Chrome 中产生,但在 IE 和 Firefox 中有效。当我这样做时,我也会得到一个奇怪的值

alert(name);
4个回答

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

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

仅供参考,链接已损坏
2021-03-15 00:07:40
@FelixKling 我几乎把它name当作一个保留字对待,因为有些主机也给函数一个name属性(我以前被它咬过),闭包不会缩小它,等等。
2021-03-20 00:07:40
是的,据我所知,这个问题有几个问题......
2021-03-25 00:07:40
很好...我根本没有注意变量名。
2021-04-07 00:07:40

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

HTML5 规范要求它window.name是一个DOMString. 这意味着值window.name可以仅是一个字符序列,而不是一个对象。

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

使用 ES6+,您可以将代码编写为let nameconst name这不会分配它或尝试覆盖window.name. 更多关于这里

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

window.name用于设置窗口的名称,由于窗口名称只能是字符串,因此您设置的任何内容window.name都会转换为字符串。而字符串作为原始值,不能有属性。解决方案是使用不同的变量名或不同的作用域。

或者,window.name如果您先拥有此代码,则可以随意使用我根本不推荐这样做,但是,作为概念证明:

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

此外,您应该使用{}代替new Object. 除了更简洁之外,它还更高效、更明确。

要不就 delete name;
2021-03-11 00:07:40
请注意,__defineGetter____defineSetter__都已弃用。使用defineProperty来代替。
2021-04-09 00:07:40