对象属性名称作为数字

根据官方JavaScript文档,您可以使用整数定义对象字面值属性名称:

另外,您可以使用数字或string来表示属性的名称。

像这样:

me = { name: "Robert Rocha", 123: 26, origin: "Mexico" } 

我的问题是,你如何引用以整数作为名称的属性? 我尝试了平常的me.123但得到了一个错误。 我能想到的唯一的解决方法是使用for-in循环。 有什么build议么?

您可以像引用数组一样引用对象的属性,并使用me[123]me["123"]

点符号仅适用于有效标识符的属性名称。 标识符必须以字母$,_或unicode转义序列开头。 对于所有其他属性名称,您必须使用括号表示法。

在对象字面上,属性名称必须是标识符名称,string字面量或数字字面量(由于属性名称必须是string,因此将被转换为string):

 var obj = {1:1, foo:'foo', '+=+':'+=+'}; alert(obj[1] + ' ' + obj.foo + ' ' + obj['+=+']); // 1 foo +=+ 

你可以使用me[123]me["123"] 。 两者都有效。

你可以使用方括号 me[123]

以防其他人被这个困惑:使用整数(而不是string)属性名称可能略有不同 – 虽然function相同 – 结果(取决于浏览器),当对象在对象内。

没有嵌套对象的简单对象在浏览器中具有一致的行为(尽pipe接受的答案是 ,我们需要使用括号而不是点来访问整数属性名称):

 var str_simple = { a: "b", c: "d", e: "f", g: "h", }; str_simple.a === "b"; // true str_simple.e === "f"; // true var int_simple = { 1: 2, 3: 4, 5: 6, 7: 8, }; int_simple[1] === 2; // true - must use brackets instead of dots int_simple[5] === 6; // true // this works b/c int property names are coerced to strings anyway int_simple[1] === int_simple['1']; // true 

而这个带有string键的嵌套对象完全按照预期工作:

 var str_nested = { a: {b: "c"}, d: {e: "f", g: "h"}, }; str_nested.a; // returns object as expected, no matter the browser - {b: "c"} str_nested.ab === "c"; // true str_nested.dg === "h"; // true 

但是,这个等效的嵌套整数键的对象,根据浏览器的不同,返回的结果会稍有不同,尽pipe你仍然可以用相同的方式访问嵌套对象(所以在function上它仍然是一样的):

 var int_nested = { 1: {2: 3}, 4: {5: 6, 7: 8}, }; // latest Chrome (57) // Safari 10 (latest for my Mac, 10.10 Yosemite) int_nested[1]; // returns object as expected - {2: 3} int_nested[1][2] === 3; // true // latest Firefox (52) int_nested[1]; // RETURNS ARRAY-LIKE OBJECT - Object [ <2 empty slots>, 3 ] int_nested.length; // undefined because it's not technically an array int_nested[1][2] === 3; // true - works b/c object was padded with empty slots // and again, in all browsers, we can exchange the integer keys // for equivalent strings since property names are coerced to strings anyway int_nested[1][2] === int_nested['1'][2]; int_nested['1'][2] === int_nested[1]['2']; int_nested[1]['2'] === int_nested['1']['2']; 

如果以编程方式构造嵌套对象,此行为仍将略有不同,但function相同。 例如,假设我们想要写一个函数来获得一个列表(例如[[0, 0], [0, 1], [1, 2], [2, 3]] )并将其转换为嵌套的对象,所以我们可以检查对是否在O(1)时间的对象(例如{0: {0: true, 1: true}, 1: {2: true}, 2: {3, true}} )。 请注意, Sets检查引用相等而不是值相等 ,所以我们不能将这个对本身存储在Set中,并获得相同的结果:

 // [[0, 0], [0, 1], [1, 2], [2, 3]] -> // { // 0: {0: true, 1: true}, // 1: {2: true}, // 2: {3: true}, // } function createNestedObject(pairs) { var obj = {}; for (var pair of pairs) { var x = pair[0], y = pair[1]; // must create outer object for each unique x or else // obj[x][y] would fail b/c obj[x] would be undefined if (!obj.hasOwnProperty(x)) { obj[x] = {}; } obj[x][y] = true; } return obj; } function exists(nested, pair) { var x = pair[0], y = pair[1]; // uses !! operator so if pair isn't in nested // we return false instead of undefined return !!(nested[x] && nested[x][y]); } 

带有string的对将按预期工作:

 var pairs = [["a", "a"], ["a", "b"], ["c", "d"], ["d", "e"]]; var nested = createNestedObject(pairs); nested; // as expected - {a: {a: true, b: true}, c: {d: true}, d: {e: true}} exists(nested, ["a", "a"]); // true exists(nested, ["a", "b"]); // true exists(nested, ["ZZZ", "ZZZ"]); // false 

但在某些浏览器中,整数对将会有所不同,但在function上是相同的:

 var pairs = [[0, 0], [0, 1], [1, 2], [2, 3]]; var nested = createNestedObject(pairs); nested; // in Safari 10/Chrome 57 - returns nested objects as expected nested; // in Firefox 52 - Object [ Object[2], Object[3], Object[4] ] // BUT still gives correct results no matter the browser exists(nested, [0, 0]); // true exists(nested, [0, 1]); // true exists(nested, ['0', '0']); // true exists(nested, [999, 999]); // false