散列键会自动转换为int吗?

时间:2011-03-30 20:20:49

标签: javascript json

JavaScript控制台代码段:

> obj = {"1": "Hello, World", "2": "Goodbye, World"};
> obj[1]
  "Hello, World"
> obj["1"]
  "Hello, World"

因此,出于某种原因,如果您有可以转换为整数的键,则也可以使用整数访问相应的值。这非常有用:我正在通过Ajax获取JSON,并且在JSON中,将int作为哈希键(或者至少Python的JSON序列化器认为如此)是不合法的。但是,我需要以int的形式访问它们,这就是我想知道的原因:

  1. 为什么会这样?
  2. 可靠吗? (我可以看到它适用于Chrome和Firefox,这对我的应用来说已经足够了,但我不希望它成为一些常见错误,将在下一版本中修复)

4 个答案:

答案 0 :(得分:4)

JavaScript对象的所有属性都是字符串。请注意此行为:

var foo = {};
foo[foo] = "hello";
console.log( foo["[object Object]"] );
//-> "hello"

foo.toString = function(){ return "sassy" };
foo.sassy = "Oh yes!";
console.log( foo[foo] );
//-> "Oh yes!"

因此,当您设置或获取foo[1]时,您实际上正在设置/获取foo[1.toString()]。是的,这很可靠。

答案 1 :(得分:3)

JavaScript 喜欢将您的数字转换为字符串。只要它可以,它就会。检查类型转换规则。

这可能会有所帮助: http://united-coders.com/matthias-reuter/all-about-types-in-javascript-automatic-type-conversion

编辑 - 有趣的事实:

>>> "3" + "5"
"35"
>>> "3" - "2"
1

答案 2 :(得分:3)

我不会说您的密钥已转换为整数。我会说toString()在你的'访问者'(你在obj [1]中使用的密钥)被调用,因为它应该是一个字符串。

答案 3 :(得分:-1)

1和“1”在松散类型的语言(如javascript)中的含义几乎相同(请记住,JSON是javascript对象表示法)。