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

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

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

正如你所指出的, JSON.parse()需要一个string,而不是一个数组。 但是,如果给定一个数组或任何其他非string值,该方法将自动强制为一个string,而不是立即抛出。 从规格 :

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

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

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

注意string值不再被引用。 这意味着['1234'][1234]都转换为相同的string'1234'

所以你真的在做什么:

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

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

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

如果JSON.parse没有得到一个string,它将首先将input转换为string。

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

从所有这些输出只知道如何parsing“1234”。

这里要注意两点:

1) JSON.parse将参数转换为一个string(参考spec中algorithm的第一步)。 您的input结果如下:

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

2) json.org的规格说明:

[…]值可以是双引号或数字,或者真或假或空,或对象或数组中的string。 这些结构可以嵌套。

所以我们有:

 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 ",")