带/不带引号的Javascript对象属性

6
我是一名JavaScript学习者,想知道“==”和“===”之间的区别。

    var obj1 = {
        attribute1 : 1
    };
    
    var obj2 = {
        "attribute1" : 1
    };
    
    console.log(obj1.attribute1);
    console.log(obj2.attribute1);

它们都打印出1。它们之间有重大区别吗?


第二个版本更倾向于如何设置JSON期望的属性标签,根据您当前的示例,没有太大的区别,对象字面量可以编码为第一个版本。 - Icepickle
我认为没有区别,只是两种不同的编码风格。 - Elias
这并不是关于样式或JSON的问题... 引号通常是可选的,但有时是必需的,这取决于你的键叫什么。JSON标准化了这一点,使其始终是必需的。 - deceze
JSON 是关于序列化的,不要忘记它和 JavaScript 对象是 不同 的东西。 - Pac0
3个回答

5

在您的情况下,它们是等效的。

在内部,它们是相同的。

可能会改变的是您可以使用代码访问它们的方式。

在使用字符串(带引号的属性)时,您实际上可以使用更奇特的属性名称:

var obj3 = {
    "attribute with space": 1,
    "123AttributeStartingWithANumber": 1,
}

在我的例子中,你不能通过obj1.attributeName语法来访问那些属性名称(但使用方括号符号可以: obj1["attribute with space"]obj1["123AttributeStartingWithANumber"])。
这是因为“attribute with space”或“123Attribute”在JS中不是有效的标识符。
注意,在你的例子中也可以使用方括号符号。
console.log(obj1["attribute1"]);
console.log(obj2["attribute1"]);

简而言之,引用deceze的评论:

引用属性和括号表示法总是起作用的,不带引号的属性和.点访问是当您的属性名是有效标识符时的缩写。


为了简化这个答案:引用属性和括号表示法总是有效,未引用的属性和.点访问是当您的属性名称是有效标识符时的速记。 - deceze
谢谢,我漏掉了“标识符”这个词。我自作主张将您的总结包含在引语中。 - Pac0

1

如果您将对象键声明为字符串,则可以在其中使用空格:

var obj1 = {
   attribute1 : 1 // but you cannot say my attribute1: 1 it will throw syntax error
};

var obj2 = {
    "my attribute1" : 1 
};

console.log(obj1.attribute1);
console.log(obj2["my attribute1"]);

你的代码最后一行无效。 - Andrew
1
你是对的。我已经修复了。 - Lazar Nikolic

1

没有区别。

对象字面量语法允许您使用字符串或标识符来提供属性名称。

字符串允许您使用在标识符中不允许的字符(例如.),但attribute1中没有这些字符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接