有效的javascript对象属性名称

haw*_*ett 68 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)
Run Code Online (Sandbox Code Playgroud)

这篇文章详细介绍了有效的javascript变量名称,' - ^ color'显然无效(作为变量名).这同样适用于对象属性名称吗?看看上面我试图解决的问题

  1. b [' - ^ color']无效,但可以在所有浏览器中使用quirk,我不应该相信它可以继续工作

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

  3. 还有别的

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

var abc = 0;
Run Code Online (Sandbox Code Playgroud)

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

window['abc'] = 0;
Run Code Online (Sandbox Code Playgroud)

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

window['@£$%'] = "bling!";
alert(window['@£$%']);
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*hen 61

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

window['abc']
Run Code Online (Sandbox Code Playgroud)

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

abc
Run Code Online (Sandbox Code Playgroud)

  • "对象属性名称可以是任何有效的JavaScript字符串,也可以是任何可以转换为字符串的字符串,包括空字符串.但是,任何属性名称都不是有效的JavaScript标识符(例如,具有空格的属性名称)或者连字符,或以数字开头的连字符)只能使用方括号表示法访问." ([MDN(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects#Objects_and_properties)) (42认同)
  • ***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]"` (10认同)
  • 要清楚,鉴于我之前的评论的例子,`obj [x] === obj [y] === obj ["[object Object]"]` (4认同)

Mat*_*nen 14

对象属性命名规则和变量命名规则是分开的.该标准仅"保留"少数属性名称(例如prototypeconstructorIIRC),但除此之外,任何字符串都会出现.

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


小智 8

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

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

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