为什么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,而不是立即抛出。 从规格 :
- 让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')
1234as
和123,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 ",")