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

我有问题理解的行为 JSON.parseJSON.parse应该只适用于字符串。但对于只包含一个字符串(甚至是单引号)的数组,如果该字符串只包含数字,那么它似乎可以工作。

JSON.parse(['1234']) // => 1234
JSON.parse(['1234as']) // => throws error
JSON.parse(['123', '123']) // => throws error
7443 次浏览

正如您所指出的,JSON.parse()需要的是字符串,而不是数组。但是,当给定一个数组或任何其他非字符串值时,该方法将自动将其强制转换为字符串并继续执行,而不是立即抛出。来自 规格:

  1. 让 JText 成为 ToString (text)。
  2. ...

数组的字符串表示形式由它的值组成,用逗号分隔

  • 返回 '1234',
  • String(['1234as'])返回 '1234as',并且
  • 返回 '123,123'

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

所以你真正要做的是:

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

1234as123,123都不是有效的 JSON,因此 JSON.parse()在这两种情况下抛出。(前者本来就不是合法的 JavaScript 语法,而后者包含一个不属于该语法的逗号运算符。)

另一方面,1234是一个 Number 文本,因此是有效的 JSON,表示它自己。这就是为什么 JSON.parse('1234')(扩展为 JSON.parse(['1234']))返回数值1234。

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

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

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

这里有两点需要注意:

1) JSON.parse将参数转换为字符串(参考规范中算法的第一步)。您的输入结果如下:

['1234']       // String 1234
['1234as']     // String 1234as
['123', '123'] // String 123,123

2) Json.org的规格说明如下:

[ ... ]值可以是双引号中的字符串,也可以是数字或 true 或 false 或 null,或对象或数组。这些结构可以是 嵌套的。

所以我们有:

JSON.parse(['1234'])
// Becomes JSON.parse("1234")
// 1234 could be parsed as a number
// Result is Number 1234


JSON.parse(['1234as'])
// Becomes JSON.parse("1234as")
// 1234as cannot be parsed as a number/true/false/null
// 1234as cannot be parsed as a string/object/array either
// Throws error (complains about the "a")


JSON.parse(['123', '123'])
// Becomes JSON.parse("123,123")
// 123 could be parsed as a number but then the comma is unexpected
// Throws error (complains about the ",")