Javascript 使用变量";名称“;不';不能使用JS对象

Javascript 使用变量";名称“;不';不能使用JS对象,javascript,object,window-object,Javascript,Object,Window Object,在这个小片段中可以看到该行为(将其作为全局脚本执行): 该警报在Chrome中产生未定义的,但在IE和Firefox中有效。当我这样做的时候,我也会得到一个奇怪的值 alert(name); 有一个特殊的用途,应该是字符串。Chrome似乎显式地将其转换为字符串,因此var name={}实际上最终为全局变量name(即window.name)提供了“[object object]”的值。因为它是一个原语,所以属性(name.FirstName)不会“粘住” 要解决此问题,请不要将name用作

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

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

alert(name);
有一个特殊的用途,应该是字符串。Chrome似乎显式地将其转换为字符串,因此
var name={}
实际上最终为全局变量
name
(即
window.name
)提供了
“[object object]”
的值。因为它是一个原语,所以属性(
name.FirstName
)不会“粘住”


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

window.name
用于设置窗口的名称,并且由于窗口名称只能是字符串,因此设置为
window.name
的任何内容都将转换为字符串。和字符串作为基本值不能具有属性。解决方案是使用不同的变量名或不同的范围

或者,如果您先使用了此代码,则可以根据需要使用
window.name
。我完全不建议这样做,但是,作为概念证明:

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

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

您的
名称
变量实际上是
窗口。名称
,因为用
变量
声明的顶级变量附加到全局对象

HTML5规范。这意味着
window.name
的值可以,而不是对象

在Chrome浏览器中,试图使用
window.name
存储除基元字符串以外的任何内容都会将该值强制为基元字符串。例如:

window.name = {};
window.name === "[object Object]"; // true
您可以通过使用不在顶级范围内的
名称
变量来避免此问题:

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

    console.log(name);
})();

使用ES6+,您可以将代码编写为
let name
const name
。这不会分配它或试图覆盖
窗口.name
。更多关于这个

let name={};
name.FirstName='Tom';

警报(name.FirstName)
语言
属性已弃用,请仅使用
类型
属性。最好使用
console.log
而不是
alert
,并使用Chrome开发工具(或FireBug)读取它们。最后,您需要在代码的第1行有一个doctype,doctype是:
AFAIK更常见的是使用
var name={}
语法。。。我输入了“Object”而不是Object。它仍然会在chrome中抛出错误。在chrome中尝试新代码。name在浏览器中是一个特殊的全局变量,您不能对其进行太多更改…window.name在浏览器中是一个特殊的全局变量。请参见,它假定类型为字符串。如果使用typeof检查nString,则它是一个对象。您可以在nodejs控制台中运行它,结果是正确的。所以这不是一个javascript问题。很好的捕获。。。我根本没有注意变量名。@FelixKling我几乎把
name
当作一个保留字来对待,因为有些主机也给函数赋予了
name
属性(我以前就被它咬过),闭包不会缩小它,等等。是的,就我记忆所及,这个问题有几个问题……仅供参考,链接已断开,也不只是
删除名称
(function() {
    var name = {};
    // this `name` is not `window.name`
    // because we're not in the top-level scope

    console.log(name);
})();