1

我的理解是对象的键总是字符串。但是,我相信如果用作键,数值会被转换为字符串,这意味着它不会是某种禁止的值类型。由于我们不在字符串键周围使用引号,因此编写如下内容:

{
    a: "a_value",
    b: "b_value", [...]
}

...我认为阅读这样的内容会更容易:

{
    1: "first_value",
    4: "whatever", [...]
}

所以我的问题是:使用数值作为键是否真的被认为是不好的做法,或者我可以这样做,至少为了可读性或可读性?

谢谢。

4

2 回答 2

2

你是对的,属性名称必须是字符串,但转换是为你完成的。也就是说,和o = {1: "test""}是一样的o = {"1": "test"}。同样,o[45]两者o[45] = "hi"都为您转换属性名称,使用toString().

这是一个快速演示,我已经覆盖toString()了它以使其显而易见:

var o = {xyz: 100, toString: function() { console.log("someone string'd me"); return "ooo"; }}
var x = {};

x[o] = "test";
// console says "someone stringed me"

console.log(x["ooo"]);
// console says "test";

console.log(x[o]);
// console says "someone string'd me", then "test"

您可以看到每次o都用作属性,它使用 . 隐式转换为字符串o.toString()。所以要清楚,使用数字键不是问题。其实你可以测试["hi", "ol", "dad"]["1"]一下,和["hi", "ol", "dad"][1]`是一回事。

于 2013-03-27T00:27:08.170 回答
2

任何值都可以用作 JavaScript 对象中的一个属性 - 如前所述[ToString],在该值上调用以获取属性名称1

因此,对象字面{1: "hi"}量等价于{"1": "hi"}.

现在,允许的Object Initialiser语法是{PropertyName: AssignmentExpression, ..}PropertyName只能是 IdentifierName ( x)、StringLiteral ( "1") 或 NumericLiteral ( 1)。其他值仍然可以用作键 - 只是没有使用对象初始化器语法声明。

无效文字的示例,以及如何使用普通属性赋值重写它:

x = {/regex/: "y"};        // invalid - only Name/String/Number allowed
x = {}; x[/regex/] = "y";  // "okay" - but very suspect!

话虽这么说,我不能说我曾经使用过“整数属性” ,除非在处理数组时......这不会出错,即使可能会怀疑。


1这适用于属性访问(例如obj[x] = y),但不适用于对象初始化器,因为 IdentifierNames被视为表达式 - 但是,所有属性名称为字符串的最终结果仍然适用。

于 2013-03-27T00:21:28.117 回答