2010-05-30 162 views
54

我正在尝试解决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) 

post细节有效的javascript变量名,和“ - ^彩”显然是无效的(作为变量名)。这同样适用于对象属性名称吗?综观上述,我试图找出是否

  1. B [“ - ^色”]是无效的,但怪癖在所有浏览器的工作原理,我不应该相信它的工作向前发展

  2. b [“ - ^色”]是完全有效的,但它只是那种只能以这种方式访问​​的形式 - (它支持这样的对象可以被用作也许映射?)

  3. 东西否则

顺便说一句,在JavaScript中的全局变量可以在顶级声明为

var abc = 0; 

,但也可以创建(据我所知)与

window['abc'] = 0; 

在以下所有作品上述浏览器

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

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

回答

53

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

window['abc'] 

正在访问一个属性。这是不是一个变量,即使它指的是相同的值(在全球范围内)为:

abc 
+37

“的对象属性名称可以是任何有效的JavaScript串,或任何可以被转换成一个字符串,包括空字符串。然而,任何属性名不是一个有效的JavaScript标识符(例如,一个包含空格或连字符的属性名称或以数字开头的属性名称)只能使用方括号表示法进行访问。“ ([MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects#Objects_and_properties)) – 2014-02-10 13:51:08

+8

***Márton提出了一个非常重要的观点***当初,可能看起来好像任何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-04-01 20:44:58

+4

为了清楚起见,根据我以前的评论的例子,'obj [ x] === obj [y] === obj [“[object Object]”]' – ChaseMoskal 2014-04-01 20:47:00

11

对象属性命名规则和变量的命名规则是分开的。该标准仅“保留”了一些财产名称(例如prototypeconstructor,IIRC),但除此之外,任何字符串都会发送。

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

+0

感谢马蒂 - 很难找出答案的答案,都回答了,但是有不同的(有用的)信息 - 回答。干杯。 – hawkett 2010-05-30 21:54:37

+1

当你将'__proto__'设置为null时,除了原型链之外还有什么断开(所以它是一个更快的属性查找),如果你需要它作为值对的简单哈希表? – 2011-06-01 11:58:01

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

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

  3. 如果你喜欢访问对象成员标准点符号(如:a.x)您没有被允许使用不同于任何特殊字符_或$;该名称也不能从数字开始。对于所有其他情况,您不得不使用方括号和引号来访问对象元素。