有效的 javascript 对象属性名称

我试图找出什么是对 javascript 对象的属性名有效的

var b = {}
b['-^colour'] = "blue";     // Works fine in Firefox, Chrome, Safari
b['colour'] = "green";      // Ditto
alert(b['-^colour']);       // Ditto
alert(b.colour);            // Ditto
for(prop in b) alert(prop); // Ditto
//alert(b.-^colour);     // Fails (expected)

这个 邮寄详细说明了有效的 javascript 变量名,而“-^ color”显然是无效的(作为变量名)。这同样适用于对象属性名吗?看着上面的内容,我想弄清楚

  1. B [’-^ color’]是无效的,但在所有浏览器中都能奇怪地工作,我不应该相信它能继续工作

  2. B [’-^ color’]是完全有效的,但它只是一种只能以这种方式访问的形式-(它是支持的,所以 Object 也许可以用作地图?)

  3. 别的东西

另外,javascript 中的全局变量可以在顶层声明为

var abc = 0;

但也可以被创造(据我所知)

window['abc'] = 0;

以下内容适用于上述所有浏览器

window['@£$%'] = "bling!";
alert(window['@£$%']);

这有效吗?它似乎与变量命名规则相矛盾——或者我没有在那里声明一个变量?变量名和对象属性名的区别是什么?

63407 次浏览

是的,对象可以用作映射,任何字符串都可以是属性名。正如您所发现的,可以使用括号语法访问某些属性 只有

window['abc']

正在访问一个属性。它不是一个变量,即使它引用的值(在全局级别)与下列值相同:

abc

对象属性命名规则和变量命名规则是分开的。标准只“保留”少数属性名(比如 prototypeconstructor,IIRC) ,但是除了这些名称之外,任何字符串都可以使用。

当然,除非执行环境(例如浏览器)决定添加更多神奇的属性。(我听说设置 __proto__会以非常奇怪的方式破坏一些东西)

  1. 每次创建全局变量时,实际上都会创建一个 全局对象的新成员(在浏览器环境中是 window,在 Node.js 中是 global,等等)。这就是为什么 window.x与(全局) var xthis.x或者仅仅是 x完全相同的原因。

  2. 理解 JavaScript 像地图一样的物体是非常正确的,因为: a)你可以动态地添加一个新元素——在任何时候; b)元素可以有任何名称——也包括特殊字符,c)你可以尝试访问一个对象/地图中不存在的元素,这不是一个错误,d)你可以从一个对象中删除一个元素。

  3. 如果您希望使用标准 点符号(例如,。a.x)不允许使用与 _ 或 $不同的任何特殊字符; 名称也不能从数字开始。对于所有其他情况,必须使用方括号和引号来访问对象元素。