为什么JSON.Analysis([‘1234’])返回1234?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (19)

我有问题了解的行为JSON.parseJSON.parse应该只适用于字符串。但它似乎适用于只包含一个字符串(即使是单引号)的数组,如果该字符串只包含数字。

JSON.parse(['1234']) // => 1234
JSON.parse(['1234as']) // => throws error
JSON.parse(['123', '123']) // => throws error
提问于
用户回答回答于

正如你所指出的那样,JSON.parse()期望一个字符串而不是一个数组。但是,如果给定一个数组或任何其他非字符串值,该方法将自动将其强制转换为字符串,然后继续而不是立即执行。从规格

  1. 让JText成为ToString(文本)。
  2. ...

数组的字符串表示由它的值组成,由逗号分隔。所以

  • String(['1234'])回报'1234'
  • String(['1234as'])回报'1234as',和
  • String(['123', '123'])返回'123,123'

注意字符串值不再被引用。这意味着,['1234'][1234]两个转换为相同的字符串,'1234'

所以你真的在做什么:

JSON.parse('1234')
JSON.parse('1234as')
JSON.parse('123,123')

1234as并且123,123不是有效的JSON,因此JSON.parse()在两种情况下都会引发。(前者不是合法的JavaScript语法,后者包含一个不属于的逗号运算符。)

1234另一方面是数字文字,因此是有效的JSON,代表自己。这就是为什么JSON.parse('1234')(并通过扩展名JSON.parse(['1234']))返回数字值1234。

用户回答回答于

如果JSON.parse没有获取字符串,它将首先将输入转换为字符串。

["1234"].toString() // "1234"
["1234as"].toString() // "1324as"
["123","123"].toString() // "123,123"

从所有这些输出中,它只知道如何解析“1234”。

扫码关注云+社区