有效的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) 

这篇文章详细描述了有效的javascriptvariables名,而' – ^ color'显然是无效的(作为一个variables名)。 这同样适用于对象属性名称吗? 看着上面我试图解决如果

  1. b [' – ^ color']是无效的,但是在所有的浏览器中都是由quirk工作的,我不应该相信它会继续工作

  2. b [' – ^ color']是完全有效的,但它只是一种只能以这种方式被访问的forms – (它被支持,所以对象可以被用作地图)。

  3. 别的东西

另外,JavaScript中的全局variables可能会在顶级声明为

 var abc = 0; 

但也可以创build(据我所知)

 window['abc'] = 0; 

以下所有的浏览器都能运行

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

这有效吗? 这似乎与variables命名规则相矛盾 – 或者我没有在那里声明一个variables? variables和对象属性名称有什么区别?

是的,对象可以用作地图,任何string都可以是属性名称。 正如您发现的那样, 只能使用括号语法来访问某些属性。

 window['abc'] 

正在访问一个属性。 这不是一个variables,即使它指的是(在全球一级)相同的价值:

 abc 

对象属性命名规则和variables命名规则是分开的。 该标准只“保留”了一些属性名称(如prototypeconstructor ,IIRC),但除此之外,任何string都会去。

当然,除了执行环境(即浏览器)决定添加更多的魔法属性。 (我听说设置__proto__以相当奇怪的方式破坏了一些东西)

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

  2. 理解JavaScript 对象就好 ,因为:a)可以随时dynamic地添加一个新的元素; b)元素可以有任何名称 – 也包括特殊字符,c)你可以尝试访问一个不存在的对象/地图的元素,这不是一个错误,d)你可以从一个对象中删除一个元素。

  3. 如果您想使用标准点符号 (例如ax )访问对象成员,则不允许使用与_或$不同的任何特殊字符; 这个名字也不能从一个数字开始。 对于所有其他情况,您不得不使用方括号和引号来访问对象元素。