我在了解的行为时遇到了问题JSON.parse
。JSON.parse
应该只适用于字符串。但是,对于仅包含一个字符串(甚至用单引号引起来)的数组,如果该字符串仅包含数字,则似乎可以正常工作。
JSON.parse(['1234']) // => 1234
JSON.parse(['1234as']) // => throws error
JSON.parse(['123', '123']) // => throws error
我在了解的行为时遇到了问题JSON.parse
。JSON.parse
应该只适用于字符串。但是,对于仅包含一个字符串(甚至用单引号引起来)的数组,如果该字符串仅包含数字,则似乎可以正常工作。
JSON.parse(['1234']) // => 1234
JSON.parse(['1234as']) // => throws error
JSON.parse(['123', '123']) // => throws error
'"foo"'
和解析之间没有区别"\"foo\""
,它们实际上是相同的字符串。
Answers:
如您所指出的,JSON.parse()
期望一个字符串而不是一个数组。但是,当给定数组或任何其他非字符串值时,该方法将自动将其强制为字符串并继续执行而不是立即抛出。从规格:
- 令JText为ToString(text)。
- ...
数组的字符串表示形式由其值组成,并用逗号分隔。所以
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
另一方面是Number文字,因此是表示自己的有效JSON。这就是为什么JSON.parse('1234')
(以及扩展名JSON.parse(['1234'])
)返回数字值1234的原因。
JSON.parse
不是很严格(特别是,它解析JSON对象和单个值)。有关更多信息,请参见此处。
JSON.parse(['[123', '123]'])
,P:
JSON.parse()
与此变化一致。
这里要注意两件事:
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 ",")