有效的javascript对象属性名称


76

我正在尝试找出对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变量名称,“-^ colour”显然无效(作为变量名称)。对象属性名称是否也一样?综上所述,我正在尝试确定

  1. b ['-^ colour']无效,但在所有浏览器中都存在古怪的现象,我不应该相信它会继续向前发展

  2. b ['-^ colour']是完全有效的,但是它的形式只能以这种方式访问​​-(受支持,所以对象也许可以用作地图?)

  3. 还有别的

顺便说一句,在javascript中的全局变量可能在顶层声明为

var abc = 0;

但也可以使用以下方式创建(据我了解)

window['abc'] = 0;

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

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

这有效吗?似乎与变量命名规则相矛盾-还是我不在那里声明变量?变量和对象属性名称之间有什么区别?

Answers:


70

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

window['abc']

正在访问属性。它不是变量,即使它引用的值与全局值相同:

abc

51
“对象属性名称可以是任何有效的JavaScript字符串,也可以是可以转换为字符串的任何内容,包括空字符串。但是,任何不是有效JavaScript标识符的属性名称(例如,带有空格的属性名称或连字符,或以数字开头)只能使用方括号表示法进行访问。” (MDN
molnarm 2014年

12
马尔顿提出了一个非常重要的观点。虽然乍一看似乎任何JS对象都可以将任何东西都当作有效的对象键,但事实并非如此-Márton正确地指出,此类属性键实际上已转换为字符串。考虑到var x=new function X(){};var y=new function Y(){};obj={x:true};-obj[y]将输出true,因为x和都y用作对象键时,都将转换为相同的字符串"[object Object]"
ChaseMoskal 2014年

4
需要明确的是,以我之前的评论为例,obj[x] === obj[y] === obj["[object Object]"]
ChaseMoskal 2014年

我将指出,限制标识符名称的原因(即使JS可以在内部将任何字符串当作变量或属性标识符进行处理)也主要是为了避免语法歧义。考虑带有破折号的属性名称: x=obj.my-prop。尚不清楚(对于阅读器和解析器而言)(这是一个名为“ my-prop”的属性)还是意图是从“ obj.my”中减去变量“ prop”。 x=obj["my-prop"]明确说明名称是字符串。
wojtow

15

对象属性命名规则和变量命名规则是分开的。该标准仅“保留”了少数属性名称(例如prototypeand和constructorIIRC),但除此之外,任何字符串都可以使用。

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


谢谢Matti-很难确定谁给出答案,两个答案都回答,但是信息不同(有用),因此得到了第一个答案。干杯。
霍克特

1
当您将其设置__proto__为null时,如果您需要将其作为值对的简单哈希表,那除了原型链(这是一个更快的属性查找)之外,这还会有什么作用?
Dimitar Christoff

8
  1. 实际上,每次创建全局变量时,实际上都会创建一个全局对象的新成员(window位于浏览器环境,globalNode.js等中)。这就是为什么window.x是完全一样的喜欢(全球)var xthis.x或只x

  2. 像地图一样理解JavaScript对象是完全正确的,因为:a)您可以随时动态地添加新元素;b)元素可以具有任何名称-还包括特殊字符,c)您可以尝试访问对象/地图中不存在的元素,这不是错误,d)您可以从对象中删除元素。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.