有效的 javascript 对象属性名称

IT技术 javascript
2021-01-25 10:32:03

我正在尝试找出对 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'] 无效,但通过 quirk 在所有浏览器中都有效,我不应该相信它会继续工作

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

  3. 别的东西

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

var abc = 0;

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

window['abc'] = 0;

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

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

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

3个回答

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

window['abc']

正在访问一个属性。它不是一个变量,即使它指的是与以下相同的值(在全局级别):

abc
明确地说,鉴于我之前评论的例子, obj[x] === obj[y] === obj["[object Object]"]
2021-03-18 10:32:03
马顿提出了一个非常重要的观点。虽然起初看起来好像任何 JS 对象都可以将任何东西作为有效的对象键,但事实并非如此——Márton 正确地指出这些属性键实际上已转换为字符串。考虑var x=new function X(){};var y=new function Y(){};以及obj={x:true};-obj[y]将输出true,因为这两个xy,作为对象键一起使用时,都被转换为相同的字符串"[object Object]"
2021-03-26 10:32:03
我会指出限制标识符名称的原因(即使 JS 可能在内部将任何字符串作为变量或属性标识符处理)主要是为了避免语法歧义。考虑带有破折号的属性名称: x=obj.my-prop不清楚(对于读者和解析器)这是一个名为“my-prop”的属性还是意图是从“obj.my”中减去一个变量“prop”。 x=obj["my-prop"]清楚地表明名称是一个字符串。
2021-03-26 10:32:03
"对象属性名称可以是任何有效的 JavaScript 字符串,也可以是任何可以转换为字符串的内容,包括空字符串。但是,任何不是有效 JavaScript 标识符的属性名称(例如,具有空格的属性名称)或连字符,或以数字开头)只能使用方括号表示法访问。” ( MDN )
2021-04-10 10:32:03

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

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

谢谢马蒂 - 很难确定谁给出答案,都回答了,但有不同的(有用的)信息 - 与第一个答案一起。干杯。
2021-03-21 10:32:03
当您设置__proto__为 null,如果您需要它作为值对的简单哈希表,那么除了原型链(因此它是一个更快的属性查找)之外,它会中断什么?
2021-03-25 10:32:03
  1. 每次创建全局变量时,实际上都会创建全局对象的一个新成员window在浏览器环境中,global在 Node.js 中,等等)。这就是为什么window.x和 (global) 完全一样var xthis.x或者只是x.

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

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