javascript中对象的标准是什么?

javascript中对象的标准是什么?,javascript,syntax,object,Javascript,Syntax,Object,或 我已经看到他们两个使用了很多次,现在我感到困惑 在JavaScript中,这两种方法几乎是等效的,您可以同时使用这两种方法,但是对于unquotedkeys版本,您不能使用保留关键字的名称定义属性,例如: {'id':1,'name':'test'} 这就是为什么规范只允许使用 编辑:好的,现在让我们看看原因 的语法定义如下: // valid var obj = { 'for': 'test' }; // SyntaxError var obj = { for: 'test'


我已经看到他们两个使用了很多次,现在我感到困惑

在JavaScript中,这两种方法几乎是等效的,您可以同时使用这两种方法,但是对于unquotedkeys版本,您不能使用保留关键字的名称定义属性,例如:

{'id':1,'name':'test'}
这就是为什么规范只允许使用

编辑:好的,现在让我们看看原因

的语法定义如下:

// valid
var obj = {
  'for': 'test'
};

// SyntaxError
var obj = {
  for: 'test'
};
ObjectLiteral: {} {PropertyNameAndValueList} PropertyName和ValueList: PropertyName:AssignmentExpression PropertyName和ValueList,PropertyName:AssignmentExpression 并且PropertyName令牌可以是:

ObjectLiteral : {} { PropertyNameAndValueList } PropertyNameAndValueList : PropertyName : AssignmentExpression PropertyNameAndValueList , PropertyName : AssignmentExpression PropertyName: 标识符 StringLiteral 数字文字 如果它是一个标识符,那么根据规范,它不可能是一个标识符,因为:

7.5.1保留字 描述 保留字不能用作标识符。 语法的第一个定义是:

7.5.1 Reserved Words Description Reserved words cannot be used as identifiers. 标识符:: 标识名称,但不保留
为了安全起见,我通常引用key和value。如果没有引用,某些关键字和其他约束可能会导致关键字出错

第一种方法很好,但是如果在声明保留关键字的属性时遇到问题,有时需要使用第二种方法


对于引号,它始终是字符串,否则解释器可能会将其解释为文字关键字/变量。

如果使用双引号而不是单引号,则第二个引号将是兼容的。

您可以使用字符串或标识符来指定对象中的属性。您甚至可以将它们混合在一起:

Identifier :: IdentifierName but not ReservedWord 这两种方法都给出相同的结果(除了在使用字符串时还可以使用关键字和分隔符)

以类似的方式,您可以使用标识符或字符串来读取属性:

var o = { 'id': 1, name: 'test'}

请注意,使用字符串创建的属性可以使用标识符读取,反之亦然,这表明创建和访问属性的方式不同,无论创建方法如何,结果属性都是相同的。

定义这样的对象时,您只是在声明标识符或变量。标识符具有某些规则,您可以在业余时间在中签出,但这两种形式是等效的。但是,当您尝试使用保留关键字或将来保留关键字时,浏览器的行为会有所不同。例如,这些不能用作标识符

alert(o.id);
alert(o['name']);
并非所有浏览器都会将其标记为错误,但某些浏览器可能会将其标记为错误。还有一个将来保留的关键字列表:)

为了安全起见,并且不必每次都查看规范,我认为最好引用您的标识符。要真正了解问题所在,请在Safari中检查它们,至少在版本4.0.4中使用这些关键字中的任何一个作为标识符。例如,尝试以下方法:

class
enum
extends
super
const
export
import
在简单声明或JSON类型对象声明中不起作用:

var class = "my class";

+1厘米,回答得很好@未知您不能使用任何没有引号的保留字。这里有一个列表供您参考:一个是用作字典键的字符串,另一个是由语言本身解析的标记,然后用作字典中的字符串。我对javascript对象的实际解释方式感兴趣。请参阅我的编辑,我对对象文本和标识符的语法做了一点详细的阐述。如果你能用代码来解释这种现象会更好。但是谢谢你+1我更喜欢第一种模式,但那只适合我。
break
do
instanceof
typeof 
case
else
new
var 
catch
finally
return
void 
continue
for
switch
while 
debugger
function
this
with 
default
if
throwdelete
in
try
class
enum
extends
super
const
export
import
var class = "my class";
var myObject = {
    goodProperty: "this works",
    class: "gimmeh the errarz codez!",
};