在考虑以下代码示例(来自Mozilla的开发人员网站)时,我在javascript中理解对象文字的语法时遇到了一些麻烦:
var car = { manyCars: {a: "Saab", "b": "Jeep"}, 7: "Mazda" };
console.log(car.manyCars.b); // Jeep
console.log(car[7]); // Mazda
我目前对javascript对象文字的理解是这样的:如果你给一个键,值对和键是一个数据类型,它就像python字典一样,使car [key]返回你设置的值键。如果您将密钥仅作为文本提供,它会将“car”中的变量定义为与密钥关联的值。但是,在上面,"b"
是一个字符串,但可以调用car.manyCars.b
,就好像它是一个设置为"Jeep"
的变量,并且car.manyCars["b"]
是有效的语法,返回"Jeep"
。
我想知道是否有人可以给我一个明确的解释,当你声明一个对象文字时实际发生了什么,因为很明显我目前的理解并不完整。
答案 0 :(得分:7)
在JavaScript中,对象文字表示法中的键被视为字符串,无论它们是否在引号中。因此,有了这个:
var car = { manyCars : {a: "Saab", "b": "Jeep"}, 7: "Mazda" };
如果你这样做:
for (var k in car) { console.log("key: " + k + " (type: " + typeof(k) + ")"); }
输出将是:
键:7(类型:字符串)
key:manyCars(type:string)
请注意,(显然)数字键7
也是string
。您甚至可以将JavaScript关键字用作对象文字中的键。
请注意,按键访问值时,规则更严格。例如,当密钥是保留字时,必须使用下标符号和引号。此外,对象文字中的裸键必须(如果它不是数字文字)是有效的JavaScript标识符名称,因此它不能包含空格,逗号或JavaScript运算符(+
,=
等等。)。
答案 1 :(得分:2)
在JavaScript对象中,文字由键值对组成。 JavaScript中的键始终是字符串,而值可以是任何数据类型。
JavaScript为定义键提供了语法糖。例如,与字符串文字不同,您不需要引用键。因此,以下两个例子是等效的:
{ x: 0 } // example 1
{ "x": 0 } // example 2
然而,这种语法糖仅适用于它们之间没有任何空格(即空格,制表符,换行符等)的标识符。例如,以下内容在JavaScript中无效:
{ a property: 0 } // whitespace not allowed in identifiers
但是,您可以通过引用标识符来解决此限制:
{ "a property": 0 } // valid
您也可以使用布尔值(true
或false
),数字文字以及undefined
和null
作为键。但请记住,他们被强制为字符串。因此你可以这样做:
var o = {
undefined: 1,
null: 2,
true: 3,
false: 4,
0: 5
};
然后您可以访问它们:
alert(o.undefined); // 1
alert(o.null); // 2
alert(o.true); // 3
alert(o.false); // 4
alert(o[0]); // 5
最后一句话很重要。数字文字本身不会被分类为有效标识符。因此,您需要使用数组括号表示法([]
)而不是点符号(.
)来访问它。
由于JavaScript中的所有键都是字符串,您甚至可以这样做:
alert(o["undefined"]); // 1
alert(o["null"]); // 2
alert(o["true"]); // 3
alert(o["false"]); // 4
alert(o["0"]); // 5
但是,您不能将对象,数组或函数用作键。例如,以下内容无效:
{ {1: 2}: 3 } // objects can't be used as keys
{ [1]: 2 } // arrays can't be used as keys
{ function () {}: true } // functions can't be used as keys
这就是你需要了解的关于对象文字的所有内容。
答案 2 :(得分:0)
本质上,javascript中的对象文字与字典非常相似,但也具有Java或PHP中对象的功能。对象可以具有在其中定义的功能或属性,或两者。您可以使用引号或点语法,具体取决于您尝试访问的键。有些可能有特殊字符,那么你想要使用引号,如果没有特殊字符,请使用点。两者都是正确的。
这是一个有用的资源,可以比较和对比创建对象文字和通过构造函数创建对象之间的区别。
http://net.tutsplus.com/tutorials/javascript-ajax/the-basics-of-object-oriented-javascript/
这是另一个更深入地讨论对象文字的使用