我正在尝试找出对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)
此post详细说明了有效的javascript变量名称,而“ - ^ color”显然无效(作为变量名称)。这同样适用于对象属性名称吗?看看上面的内容,我正在努力研究
b [' - ^ color']无效,但在所有浏览器中都可以使用quirk,我不应该相信它可以继续工作
b [' - ^ color']完全有效,但它只是一种只能以这种方式访问的表单 - (它支持所以对象可以用作地图吗?)
其他
另外,javascript中的全局变量可能会在顶层声明为
var abc = 0;
但也可以使用
创建(据我所知)window['abc'] = 0;
以下所有浏览器都适用
window['@£$%'] = "bling!";
alert(window['@£$%']);
这有效吗?它似乎与变量命名规则相矛盾 - 或者我不是在那里声明变量?变量和对象属性名称之间有什么区别?
答案 0 :(得分:60)
是的,对象可以用作地图,任何字符串都可以是属性名称。正如您所发现的,某些属性只能使用括号语法访问。
window['abc']
正在访问一个属性。它不是变量,即使它引用相同的值(在全局级别):
abc
答案 1 :(得分:13)
对象属性命名规则和变量命名规则是分开的。该标准仅“保留”少数属性名称(例如prototype
和constructor
,IIRC),但除此之外,任何字符串都会出现。
当然,执行环境(即浏览器)决定添加更多魔术属性。 (我听说设置__proto__
以非常奇怪的方式打破了一些事情)
答案 2 :(得分:8)
每次创建全局变量时,实际上都会创建全局对象的新成员(在浏览器环境中为window
,在节点中为global
.js等)。这就是window.x
与(全局)var x
,this.x
或x
完全相同的原因。
了解JavaScript 对象就像地图是完全正确的,因为:a)您可以随时动态添加新元素; b)元素可以有任何名称 - 也包括特殊字符,c)您可以尝试访问对象/映射的不存在的元素,这不是错误,d)您可以从对象中删除元素。
如果您想使用标准点符号(例如a.x
)访问对象成员,则不允许使用与_或$不同的任何特殊字符;名称也不能从一个数字开始。对于所有其他情况,您不得不使用方括号和引号来访问对象元素。