我可以在javascript对象中使用数字吗?
我的理解是,对象的键总是字符串。然而,我相信如果用作键,数值将被转换为字符串,这意味着它不会是某种禁止的值类型。 因为我们在字符串键周围不使用引号,所以编写如下内容:我可以在javascript对象中使用数字吗?,javascript,Javascript,我的理解是,对象的键总是字符串。然而,我相信如果用作键,数值将被转换为字符串,这意味着它不会是某种禁止的值类型。 因为我们在字符串键周围不使用引号,所以编写如下内容: { a: "a_value", b: "b_value", [...] } 。。。我想读这样的东西会更容易: { 1: "first_value", 4: "whatever", [...] } 所以我的问题是:使用数值作为键是否真的被认为是不好的做法,或者我是否可以这样做,至少是为了可读性 谢
{
a: "a_value",
b: "b_value", [...]
}
。。。我想读这样的东西会更容易:
{
1: "first_value",
4: "whatever", [...]
}
所以我的问题是:使用数值作为键是否真的被认为是不好的做法,或者我是否可以这样做,至少是为了可读性
谢谢。任何值都可以作为JavaScript对象中的属性使用,只需一个catch-如前所述,在该值上调用[ToString]即可获得属性名称1
因此,对象文字{1:hi}等价于{1:hi}
现在,允许的语法是{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!
也就是说,除了处理数组,我不能说我曾经使用过integer属性。。这并不意味着它是错的,即使可能是可疑的
1这适用于属性访问,例如obj[x]=y,但不直接适用于对象初始值设定项,因为标识名不被视为表达式-但是,所有属性名为字符串的最终结果仍然适用。任何值都可以用作JavaScript对象中的属性,只需一个catch-如[ToString]所述对值调用以获取属性名称1
因此,对象文字{1:hi}等价于{1:hi}
现在,允许的语法是{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!
也就是说,除了处理数组,我不能说我曾经使用过integer属性。。这并不意味着它是错的,即使可能是可疑的
1这适用于属性访问,例如obj[x]=y,但不直接适用于对象初始值设定项,因为标识符名称不被视为表达式-但是,所有属性名称都是字符串的最终结果仍然适用。属性名称必须是字符串,这是正确的,但转换是为您完成的。也就是说,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]是一样的。属性名必须是字符串,这是正确的,但转换是为您完成的。也就是说,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]是一样的。所以您要特别询问对象文本中的标识符语法?一个具有数字索引的对象?这叫做数组。我真的不明白你在问什么。如果您知道所有属性值都转换为字符串,那么字符串是否为数字又有什么关系呢?@am not我是:我知道JavaScript可以做到这一点,但这并不一定意味着可以这样做。这可能是某种不好的做法或其他什么。@nseptier:JavaScript数组是稀疏的。它们实际上只是对象,.length表示最高索引+1。阵列中的孔没有分配。myArray[1]=abc;myArray[4]=def;myArray中的3;//False那么您是专门询问对象文字中的标识符语法?一个具有数字索引的对象?这叫做数组。我真的不明白你在问什么。如果您知道所有属性值都转换为字符串,那么字符串是否为数字又有什么关系呢?@am not我是:我知道JavaScript可以做到这一点,但这并不一定意味着可以这样做。这可能是某种不好的做法或其他什么。@nseptier:JavaScript数组是稀疏的。它们实际上只是对象,.length表示最高索引+1。阵列中的孔没有分配。myArray[1]=abc;myArray[4]=def;myArray中有3个// 错误的